2015-09-13 3 views
3

J'ai une matrice carrée A (nxn). Je voudrais créer une série de k puissances de cette matrice dans une matrice multidimensionnelle nxnxk (pas des éléments mais des puissances réelles de la matrice), par exemple [A^0 A^1 A^2..A^k]. C'est une sorte de vandermonde variée pour le cas de la matrice.Puissances d'une matrice

Je suis capable de le faire avec des boucles mais c'est agaçant et lent. J'ai essayé d'utiliser bsxfun mais pas de chance car il me manque probablement quelque chose ici.

Voici une simple boucle que je l'ai fait:

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

Répondre

2

Vous essayez d'effectuer la version cummulative de mpower avec un vecteur de valeurs k.

Malheureusement, bsxfun n'a pas encore évolué pour gérer un tel cas. Donc, le mieux que je pourrais suggérer à ce stade serait d'avoir un stockage en cours qui accumule le produit matriciel à chaque itération pour être utilisé au suivant.

Votre code de boucle d'origine avait l'air quelque chose comme ça -

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

Ainsi, avec la suggestion, le code Loopy modifié serait -

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

Analyse comparative -

%// 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 

runtimes -

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

Merci beaucoup pour la réponse rapide. Cela donne un pouvoir élément-sage de la matrice. Je cherche la puissance de la matrice. c'est A^k et non A.^k. J'espère que je suis clair avec ma question. Merci encore! – imtl

+0

@imtl Où 'k' serait un droit scalaire? – Divakar

+0

Ok. Je vais essayer à nouveau d'expliquer mieux. k est un vecteur de 0: 1: m (m = 100 par exemple). Je voudrais obtenir les m puissances d'une matrice A (nxn). C'est un multiarray de [A^0 A^1 A^2 .... A^m]. Dans l'ensemble, m matrices. Ou un tableau nxnxm. J'espère que je suis plus clair maintenant. Désolé pour la confusion. – imtl