2012-07-19 1 views
3

J'ai une matrice 2x2, dont chaque élément est un vecteur 1x5. quelque chose comme ceci:Matlab: déterminant d'une matrice de vecteurs

x = 1:5; 
A = [ x x.^2; x.^2 x]; 

Maintenant, je veux trouver le déterminant, mais cela se produit

B = det(A); 
Error using det 
Matrix must be square. 

Maintenant, je peux voir pourquoi cela se produit, voit Matlab A comme une matrice de 2x10 de doubles. Je veux être capable de traiter x comme un élément, pas comme un vecteur. Ce que je voudrais est det(A) = x^2 - x^4, puis obtenir B = det(A) comme un vecteur 1x5.

Comment puis-je y parvenir?

+0

Voulez-vous une version vectorisée de 'det'? –

+0

Je suppose que oui, ouais – Eddy

+0

pourquoi ne pouvez-vous pas simplement calculer det (A) = x.^2 - x.^4'? – chaohuang

Répondre

3

Bien que Matlab ait des installations symboliques, elles ne sont pas géniales. Au lieu de cela, vous voulez vraiment vectoriser votre opération. Cela peut être fait dans une boucle, ou vous pouvez utiliser ARRAYFUN pour le travail. Il semble que ARRAYFUN serait probablement plus facile pour votre problème.

La ARRAYFUN approche:

x = 1:5; 
detFunc = @(x) det([ x x^2 ; x^2 x ]); 

xDet = arrayfun(detFunc, x) 

qui produit:

>> xDet = arrayfun(detFunc, x) 
xDet = 
    0 -12 -72 -240 -600 

Pour un déterminant plus complexe, comme votre cas 4x4, je voudrais créer un M-fichier séparé pour la fonction réelle (au lieu d'une fonction anonyme comme je l'ai fait ci-dessus), et passez-le à ARRAYFUN en utilisant une poignée de fonction:

xDet = arrayfun(@mFileFunc, x); 
+0

Merci, j'ai fini par utiliser l'approche de la fonction anonyme parce que je ne pouvais pas le faire fonctionner autrement. Garder les erreurs de cracher sur "Pas assez d'entrées" ou quelque chose. – Eddy

1

Eh bien mathématiquement un Determinant est seulement défini pour une matrice carrée. Donc, à moins de pouvoir fournir une matrice carrée, vous ne serez pas en mesure d'utiliser le déterminant.

Note Je sais que wikipedia n'est pas la fin de toutes les ressources. Je le fournis simplement car je ne peux pas facilement fournir une impression de mon livre de calcul de collège.

Mise à jour: Solution possible?

x = zeros(2,2,5); 
x(1,1,:) = 1:5; 
x(1,2,:) = 5:-1:1; 
x(2,1,:) = 5:-1:1; 
x(2,2,:) = 1:5; 

for(n=1:5) 
    B(n) = det(x(:,:,n)); 
end 

Quelque chose comme ça fonctionnerait, ou cherchez-vous à comptabiliser chaque vecteur en même temps? Cette méthode traite chaque «couche» comme elle est propre, mais j'ai une suspicion sournoise que vous voulez obtenir une seule valeur en conséquence.

+0

Le fait est que, si vous traitez x symboliquement, j'ai une matrice carrée. Ce que je dois comprendre, c'est comment calculer le déterminant symboliquement et ensuite substituer un vecteur pour x. – Eddy

+0

Juste un lancer sur le dessus de ma tête ici comme une soultion possible. Mise à jour de la réponse avec. –

+0

Bien que je n'ai pas fini par utiliser cette solution, cela m'a été utile pour quelque chose d'autre que je faisais avec le déterminant, donc je vais le remettre en question. – Eddy

Questions connexes