如何在单元格上进行矢量化操作?

时间:2018-05-21 05:16:08

标签: matlab octave cell-array

鉴于B = {"7" "8" "9"},我希望将其值用作A中每个单元格的最终元素的相应替换,即转换

A = {{1 2} {3 4} {5 6}}

A = {{1 "7"} {3 "8"} {5 "9"}}

在未形成的形式中,这可以写成:

nn = cellfun(@numel, A)
for i = 1:numel(a)
  A{i}{nn(i)} = B{i};
end

所有子单元可能具有相同的长度,但是任意长度的子单元的解决方案都是理想的。

我找到的唯一解决方案是制作A:

的重塑副本
nn = cellfun(@numel, A)      #=> 2 2 2
A2 = horzcat(A{:})           #=> {1 2 3 4 5 6}
jj = cumsum(nn)              #=> 2 4 6
[A2{jj}] = B{:}              #=> {1 "7" 3 "8" 5 "9"}
ii = [1 jj(1:end-1)+1]       #=> 1 3 5
A = cellslices(A2,ii,jj,2)   #=> {{1 "7"} {3 "8"} {5 "9"}

我希望像下面这样的东西能起作用 - 但它没有:

octave:1> [[A{:}]{ii}] = B{:}
error: invalid lvalue function called in expression

有没有办法对此操作进行矢量化?

1 个答案:

答案 0 :(得分:1)

从评论中了解到,您实际上只是想避免明确的for / while循环并且可以使用cellfun(使用的不是矢量化),可以使用cellfun进行复制,如下所示:

A = cellfun(@(k) {A{k}{1:end-1} B{k}}, num2cell(1:numel(A)), 'un', 0);

arrayfun为:

 A = arrayfun(@(k) {A{k}{1:end-1} B{k}}, 1:numel(A), 'un', 0);