【发布时间】:2016-10-25 12:59:42
【问题描述】:
我想计算以下矩阵
M(i,j)=sum_(k,l) c(k,l) kron(N(:,:,k),N(:,:,l))
其中N 的前两个索引是行数和列数(在这种情况下相等),最后一个索引表示我有一个矩阵族N,而矩阵c 只是一个系数矩阵。指数 k 和 l 从 1 到 50(在我的具体情况下)。
为此,我实现了以下算法:
c=randn(50,50);
N=randn(26,26,50);
M=zeros(size(N,1)^2);
for k=1:size(N,3)
for l=1:size(N,3)
M=M+c(k,l).*kron(N(:,:,k),N(:,:,l));
end
end
这段代码有一些有趣的地方,我不知道为什么会发生:
假设我截断了k 中的总和,直到一个有限的数字n。 k 从 1 变为 n 与从 1 变为 n+1 时的计算时间差远高于(大约和数量级)仅计算由索引的矩阵所需的时间k=n+1 并将其与计算到 k=n 的总矩阵相加。
我的问题是:是否有更有效的方法来计算我正在寻找的矩阵?这个算法出了什么问题?
非常感谢。
【问题讨论】:
-
zeros(n)创建一个维度为 nxn 的 2D 方阵,因此在您的示例中,您创建 M,一个 2D 矩阵,但您尝试使用M(:,:,k)访问第三维 -
@obchardon 很确定这是他的代码中的错字。亚历克斯 - 检查我的编辑。
-
@Alex 您的公式与您的代码不完全匹配。那么首先,你能确认你上面的当前代码产生了正确的预期输出吗?只有这样你才应该考虑优化/矢量化这些循环..
-
@Amro 唯一缺少的是输入矩阵
c和输入矩阵系列N。其余的,代码正是我正在运行的。您可以放置您喜欢的矩阵,但我现在添加一些以供参考。 -
@Alex 好的。第一个想法是您可以将双循环简化为一个。请注意,
[kron(A,C); kron(B,C)]与kron([A;B],C)相同。因此,您可能可以将所有切片N(:,:,k)连接到一个高矩阵中,然后在一个循环中将其乘以每个切片N(:,:,l)而不是两个。然后您将它们拆分并累积。
标签: matlab optimization matrix matrix-multiplication