什么是在matlab中减去两个单元格数组的最快方法

时间:2015-05-11 19:17:21

标签: matlab cell-array

假设我有两个单元阵列A和B,这些单元格中的每个元素都是N * M矩阵,例如:
>>> x = [None] * 3 >>> n = len(x) >>> y = [True]*sum(divmod(n, 2)) + [False]*(n//2) >>> y [True, True, False] >>> x = [None] * 4 >>> n = len(x) >>> y = [True]*sum(divmod(n, 2)) + [False]*(n//2) >>> y [True, True, False, False] A={ [2 3;4 5] [1 5;7 8]}都是单元格,每个元素都是2 * 2矩阵。

现在我可以像这样以元素方式减去那些单元格数组:

B={ [1 2;4 5] [7 9;10 1]}

这将导致C=cellfun(@minus,A,B,'UniformOutput',false);

现在是最快的方式吗?还是有更快的方法?

考虑具有大量矩阵的单元,每个矩阵都很小。

2 个答案:

答案 0 :(得分:3)

您可以转换为3D数组,子接触并转换回来:

mat2cell(cat(3, A{:}) - cat(3, B{:}), size(A{1},1), size(A{1},2), [1 1]);

当然,如果您可以避免转换,也就是直接使用3D数组,那会更快。

答案 1 :(得分:1)

如前所述,很多都取决于数据,但在您的示例中,最快的方法可能是嵌套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