8
votes

Déterminer si une matrice est diagonalisable dans le langage de programmation R

J'ai une matrice et j'aimerais savoir s'il est diagonalizable. Comment puis-je faire cela dans le langage de programmation R?


6 commentaires

S'il vous plaît posez votre question sur un forum de mathématiques pertinent ...


C'est bon, ils sont attendus. blog.stackverflow.com/2009/07/stack-overflow-flash-mobs


@Mitch: C'est une question de programmation. R est un langage de programmation.


@jalf: Je suis d'accord. La mise en place d'une méthode statistique dans une langue donnée est certainement une question de programmation. Si la question avait été "Comment puis-je dire si une matrice est diagonalisable?" Ensuite, ce serait une question de statistiques.


@JD Long: La diagonalisation a rien en particulier avec les statistiques. Il peut être applicable dans des statistiques avancées, mais est un sujet d'étude dans des mathématiques pures à part entière.


@noldorin bon point! J'aurais dû dire "la mise en œuvre de toute méthode dans une langue donnée est certainement une question de programmation". Vous avez raison que le sujet ici est beaucoup plus général que les statistiques. Je répondais à l'affirmation selon laquelle ce n'était pas une question de programmation appropriée.


4 Réponses :


4
votes

Vous pouvez implémenter l'algorithme complet pour vérifier si la matrice se réduit à une forme jordanienne ou en diagonale (voir par exemple, Ce document ). Ou vous pouvez prendre la manière rapide et sale: pour une matrice carrée N-dimensionnelle, utilisez des valeurs d'Eigen (m) $ et vérifiez qu'ils sont des valeurs distinctes. Pour les matrices aléatoires, cela suffit toujours: la dégénérescence a prob.0.

P.s.: Basé sur une simple observation de JD Long Ci-dessous, j'ai rappelé qu'une condition nécessaire et suffisante pour la diagonalisabilité est que les vecteurs propres à l'espace d'origine. Pour vérifier cela, voir simplement que la matrice Eigenvector a un rang complet (pas de zéro eigenvalue). Voici donc le code: xxx


3 commentaires

Vous n'avez pas besoin de vous inquiéter de ce que signifie exactement quels moyens distincts lorsqu'ils sont calculés avec des mathématiques de points flottants?


Oui, et c'est là que la connaissance de la structure du problème aide. Si la matrice a certaines structures aléatoires, par exemple IID gaussien, celui-ci peut réclamer certaines propriétés de distribution d'Eigenvalues ​​(typiquement uniformes sur le cercle de l'unité), puis mettre en œuvre des tests simples pour l'hypothèse nulle que les valtières propres sont identiques. Ce document est essentiellement tout ce que je connais sur des matrices aléatoires: tinyurl.com/eigenvalues ​​. Si rien n'est connu sur la matrice, j'essayerais quelques heuristiques de plus. P.s.: J'aime ggplot2!


Merci d'avoir pris ce que je savais et je l'étire dans une bien meilleure réponse! Bon travail. C'est exactement pourquoi j'aime Stackoverflow; Les bonnes choses flotte au sommet beaucoup plus évidemment qu'avec une discussion filetée pure. (ggplot fait, en effet, rock!)



2
votes

Vous voudrez peut-être consulter Cette page pour une discussion de base et code. Vous devrez rechercher des "diagonalisations" où la partie pertinente commence.


0 commentaires

7
votes

Si vous avez une matrice donnée, m, alors une solution est la tâche des vecteurs d'Eigen fois sur la diagonale des valeurs Eigen fois l'inverse de la matrice d'origine. Cela devrait nous rendre la matrice d'origine. Dans r qui ressemble à: xxx

donc dans cet exemple p% *% d% *% résolvez (p) doit être identique au M < / code>


2 commentaires

C'est un bon point. Pour répondre à la question initiale (pour vérifier la diagonalisabilité de la matrice M): 1) Calculez la matrice de la matrice Eigenvector P = Vecteurs $ (M) $ Vecteurs 2) Vérifiez que la matrice de la matrice Eigenvector n'est involonible (c'est-à-dire que la résolution (P) n'entraîne pas Erreur). Si oui, alors il est diagonalisable et l'action unitaire est P. sinon, il n'est pas diagonalisé. Pourquoi? Parce que l'inversibilité signifie que la dimension du produit direct des espaces propres est la même que la dimension de la matrice d'origine, et cette condition est nécessaire et suffisante pour la diagonalisabilité.


Remarque Si la matrice est symétrique, nous n'avons pas besoin de résoudre (p) car les propulseurs de matrice symétriques sont orthogonaux et transposez de la matrice orthogonale est son inverse. Nous pouvons donc écrire p% *% d% *% t (p). Juste une optimisation potentielle pour le cas lorsque m = t (m)



0
votes

Toutes les matrices symétriques à travers la diagonale sont diagonalisables par des matrices orthogonales. En fait, si vous voulez une diagonalisabilité que par une conjugaison de matrice orthogonale, c'est-à-dire d = p un p 'où p' suffit à transposer puis de symétrie à travers la diagonale, c'est-à-dire a_ {ji} = a_ {ji}, est exactement équivalent à la diagonalizabilité.

Si la matrice n'est pas symétrique, la diagonalisabilité signifie pas d = p un p 'mais simplement d = p un p ^ {- 1} et nous ne le faisons pas a nécessairement avoir p '= p ^ {- 1} qui est la condition d'orthogonalité.

Vous devez faire quelque chose de plus substantiel et il y a probablement une meilleure solution, mais vous pouvez simplement calculer les vecteurs propres et vérifier le rang égal à la dimension totale.

voir Cette discussion pour une explication plus détaillée.


0 commentaires