在 matlab 中减去两个元胞数组的最快方法是什么
what's the fastest way to subtract two cell arrays in matlab
假设我有两个元胞数组 A 和 B,这些元胞中的每个元素都是 N*M 矩阵,示例:
A={ [2 3;4 5] [1 5;7 8]}
和 B={ [1 2;4 5] [7 9;10 1]}
都是单元格,每个元素都是 2*2 矩阵。
现在我可以像这样按元素减去这些元胞数组:
C=cellfun(@minus,A,B,'UniformOutput',false);
这将导致 C={[1 1;0 0] [-6 -4;-3 7]}
。
现在这是最快的方法吗?还是有更快的方法?
考虑具有大量矩阵的单元格,每个矩阵都很小。
您可以转换为 3D 数组、减去并转换回来:
mat2cell(cat(3, A{:}) - cat(3, B{:}), size(A{1},1), size(A{1},2), [1 1]);
当然如果你能避免转换会更快,即直接使用 3D 数组。
如前所述,很大程度上取决于数据,但在您的示例中,最快的方法可能是嵌套 for 循环:
A={ [2 3;4 5] [1 5;7 8]};
B={ [1 2;4 5] [7 9;10 1]};
tic
C=cellfun(@minus,A,B,'UniformOutput',false);
toc
tic
s = size(A);
for ii=1:s(1)
for jj=1:s(2)
D{ii,jj} = A{ii,jj}-B{ii,jj};
end
end
toc
isequal ( C, D )
输出:
Elapsed time is 0.001420 seconds.
Elapsed time is 0.000017 seconds.
ans =
1
假设我有两个元胞数组 A 和 B,这些元胞中的每个元素都是 N*M 矩阵,示例:
A={ [2 3;4 5] [1 5;7 8]}
和 B={ [1 2;4 5] [7 9;10 1]}
都是单元格,每个元素都是 2*2 矩阵。
现在我可以像这样按元素减去这些元胞数组:
C=cellfun(@minus,A,B,'UniformOutput',false);
这将导致 C={[1 1;0 0] [-6 -4;-3 7]}
。
现在这是最快的方法吗?还是有更快的方法?
考虑具有大量矩阵的单元格,每个矩阵都很小。
您可以转换为 3D 数组、减去并转换回来:
mat2cell(cat(3, A{:}) - cat(3, B{:}), size(A{1},1), size(A{1},2), [1 1]);
当然如果你能避免转换会更快,即直接使用 3D 数组。
如前所述,很大程度上取决于数据,但在您的示例中,最快的方法可能是嵌套 for 循环:
A={ [2 3;4 5] [1 5;7 8]};
B={ [1 2;4 5] [7 9;10 1]};
tic
C=cellfun(@minus,A,B,'UniformOutput',false);
toc
tic
s = size(A);
for ii=1:s(1)
for jj=1:s(2)
D{ii,jj} = A{ii,jj}-B{ii,jj};
end
end
toc
isequal ( C, D )
输出:
Elapsed time is 0.001420 seconds.
Elapsed time is 0.000017 seconds.
ans =
1