我正在将一个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。如果我运行上述循环一次,速度就可以了。但是该循环将在另一个块中执行,该块将被多次调用,因此找到所有总和需要相当长的时间。我想知道是否有任何方法可以提升它。感谢
答案 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;