给定B = {"7" "8" "9"},我想使用它的值分别替换A中每个单元格的最终元素,即transform
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有没有一种方法可以向量化这个操作?
发布于 2018-05-21 15:23:20
从评论中了解到,您实际上只想避免显式的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);https://stackoverflow.com/questions/50442358
复制相似问题