鉴于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
有没有办法对此操作进行矢量化?
答案 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);