矩阵的力量

时间:2015-09-13 08:51:48

标签: matlab matrix multiplication bsxfun

我有一个方阵A(nxn)。我想将这个矩阵的一系列k次幂创建为nxnxk多维矩阵(非元素方式但矩阵的实际幂),即保留[A^0 A^1 A^2..A^k]。对于矩阵盒子来说,这是一种多样化的vandermonde。

我能够用循环来做,但它很烦人而且很慢。我尝试使用bsxfun但没有运气,因为我可能在这里遗漏了一些东西。

这是我做的简单循环:

for j=1:1:100 
    final(:,:,j)=A^(j-1); 
end

1 个答案:

答案 0 :(得分:2)

您正尝试使用k值的向量执行mpower累积版

可悲的是,bsxfun还没有进化到处理这种情况。所以,我在这一点上建议的最好的是拥有一个正在运行的存储器,它会在每次迭代时累积矩阵产品,以便在下一次迭代中使用。

您的原始循环代码看起来像这样 -

final = zeros([size(A),100]);
for j=1:1:100 
    final(:,:,j)=A^(j-1); 
end

因此,根据建议,修改后的循环代码将是 -

final = zeros([size(A),100]);
matprod = A^0;
final(:,:,1) = matprod;
for j=2:1:100 
    matprod = A*matprod;
    final(:,:,j)= matprod;
end

基准测试 -

%// Input
A = randi(9,200,200);

disp('---------- Original loop code -----------------')
tic
final = zeros([size(A),100]);
for j=1:1:100 
    final(:,:,j)=A^(j-1); 
end
toc

disp('---------- Modified loop code -----------------')
tic
final2 = zeros([size(A),100]);
matprod = A^0;
final2(:,:,1) = matprod;
for j=2:1:100 
    matprod = A*matprod;
    final2(:,:,j)= matprod;
end
toc

运行时 -

---------- Original loop code -----------------
Elapsed time is 1.255266 seconds.
---------- Modified loop code -----------------
Elapsed time is 0.205227 seconds.