寻求一种方法在matlab中使用非循环方法进行计算

时间:2012-05-20 08:32:47

标签: matlab loops

我正在将一个c程序移植到matlab来模拟一些数学问题。我在matlab中重写了所有代码,但我发现在一个循环中花了太多时间。我不知道是否有更好的方法来计算以下内容而不是使用for语句

我在结构中定义了大约1000个矩阵(所有相同的维度)

A {1} = matrix1 A {2} = matrix2 ... A {1000} = matrix1000

B是A {n}

的相同维度的常数矩阵

我想计算A {n}和B的逐元素生成,并将所有结果元素的总和返回到

for k=1:1000
  AllSum(k) = sum(sum(A{k}.*B))
end

A的大小取决于参数,典型大小为300x300。如果我运行上述循环一次,速度就可以了。但是该循环将在另一个块中执行,该块将被多次调用,因此找到所有总和需要相当长的时间。我想知道是否有任何方法可以提升它。感谢

2 个答案:

答案 0 :(得分:1)

在您的具体情况下,您可以先计算所有A矩阵的总和,然后乘以B。而不是将A定义为单元格数组,将它们定义为一个3d数组:(我同意@SeçkinSavaşçı的这个)

A(:,:,i) = ...

而不是:

A{i} = ...

然后,加总并乘以B

result = sum(A,3).* B;

答案 1 :(得分:1)

同意你应该使用3d矩阵而不是单元格。

产品总和会让您想起什么?点产品。一系列点阵产品会让您想起什么?向量矩阵乘法。所以你要做的就是重塑你的数据,这样你的矩阵的每一列都是一个展开的A {k},你的B行向量就是你展开的B矩阵。换句话说,A和B是2D的事实与你的计算无关。

如果按照建议将A转换为A(:,:,k) = A{k},则:

vec = B(:).';
mtx = reshape(A, size(A,1)*size(A,2), size(A,3));
AllSum = vec*mtx;