1

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

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

A{1} = 矩阵1 A{2} = 矩阵2 ... A{1000} = 矩阵1000

B 是与 A{n} 维数相同的常数矩阵

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

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

A 的大小取决于参数,典型大小为 300x300。如果我运行一次上述循环,速度还可以。但是该循环将在另一个块中执行,该块将被调用多次,因此需要很长时间才能找到所有总和。我想知道有没有什么办法可以提升它。谢谢

4

2 回答 2

1

在您的特定情况下,您可以先计算所有A矩阵的总和,然后乘以B. 与其定义A为元胞数组,不如将它们定义为一个 3d 数组:(我同意 @SeçkinSavaşçı 的这一点)

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

代替:

A{i} = ...

然后,求和并乘以B

result = sum(A,3).* B;
于 2012-05-20T09:08:46.137 回答
1

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

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

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

vec = B(:).';
mtx = reshape(A, size(A,1)*size(A,2), size(A,3));
AllSum = vec*mtx;
于 2012-05-21T13:48:49.903 回答