Matlab 如何对单元格进行矢量化操作?

Matlab 如何对单元格进行矢量化操作?,matlab,octave,cell-array,Matlab,Octave,Cell Array,给定B={“7”“8”“9”},我想用它的值分别替换A中每个单元格的最终元素,即转换 A = {{1 2} {3 4} {5 6}} 进入 以非部门化的形式,这可以写成: nn = cellfun(@numel, A) for i = 1:numel(a) A{i}{nn(i)} = B{i}; end 所有子单元可能具有相同的长度,但对于任意长度的子单元,解决方案将是理想的 我找到的唯一解决方案是制作一份以下文件的重塑副本: nn = cellfun(@numel, A) #

给定
B={“7”“8”“9”}
,我想用它的值分别替换
A
中每个单元格的最终元素,即转换

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

以非部门化的形式,这可以写成:

nn = cellfun(@numel, A)
for i = 1:numel(a)
  A{i}{nn(i)} = B{i};
end
所有子单元可能具有相同的长度,但对于任意长度的子单元,解决方案将是理想的

我找到的唯一解决方案是制作一份以下文件的重塑副本:

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

有没有一种方法可以将此操作矢量化?

从评论中了解到,您实际上只是想在
循环时避免显式的
,并且对
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);

如果所有子单元格的长度都相同,则可以使用矩阵而不是嵌套单元格。在处理单元格时,始终可以使用未分隔的代码。顺便说一句,cellfun是循环的单行程序包装器。它仍然是一个循环。@ SARDARSOMA它是一个用C++编写的循环,它比任何八度码循环都快。在循环中可以使用
A{i}{end}=B{i} @库巴伯,事实上,用<代码> CyFaly这一环是用C++或java编写的,而不是在MATLAB代码中,不一定使它快。事实上,
cellfun
的速度通常比
慢;例如,参见或。无论如何,性能结果取决于Matlab版本
 A = arrayfun(@(k) {A{k}{1:end-1} B{k}}, 1:numel(A), 'un', 0);