MATLAB 将元胞元素等同于数组

MATLAB equating cell elements to array

我试图将每个元素等同于对应于单元格元素的数组。 为了更准确地解释它,例如

A    = {[1 1 1], [0 0 0 0 0], [1 1],[0 0 0 0 0]};
B    = [0 1 0 0];

所以我想要的是:

A= {[0 0 0],[1 1 1 1 1],[0 0],[0 0 0 0 0]};

for 循环的可能解决方案是:

for ii=1:length(A)
     A{ii}(:)=B(ii);
end

有没有不用循环的方法?

使用repelem and mat2cell

lens = cellfun(@numel, A);

out = mat2cell(repelem(B,lens).*ones(1,sum(lens)),1,lens)

注:

  1. cellfun 伪装循环。但是,这里 cellfun 用于 单独查找元素的数量。所以这个可以考虑 几乎矢量化:P
  2. repelem 功能在 R2015a 中引入。你可能无法 运行 这在以前的版本中。相反,您可以创建自己的自定义 repelem 函数。参考 this answer

你可以这样做:

A=cellfun(@(x, y) repmat(y, size(x)), A, num2cell(B), 'uni', 0)

这样做的优点是可以处理 A 中任何大小或维数的矩阵。没有关于矢量的假设。