2014-06-28 3 views
0

J'ai une matrice triangulaire supérieure à partir de laquelle j'ai besoin d'extraire les données non nulles dans un ordre croissant et les numéros de ligne et de colonne correspondants à utiliser dans le reste du programme matlab - Quelqu'un peut-il suggérer un moyen efficace de le faire.Comment extraire des données de la matrice avec des numéros de ligne et de colonne

A titre d'illustration, voici un exemple d'une matrice que je peux avoir:

0 16.38028519 57.19639932 109.1383791 168.7622095 
0 0   12.41026354 41.10752608 80.27145093 
0 0   0   8.356508551 29.60683208 
0 0   0   0   6.510638154 
0 0   0   0   0 

Je requiers une sortie:

Data   Row Num Col Num 
6.510638154   4 5 
8.356508551   3 4 
12.41026354   2 3 
16.38028519   1 2 
29.60683208   3 5 
41.10752608   2 4 
57.19639932   1 3 
80.27145093   2 5 
109.1383791   1 4 
168.7622095   1 5 

La taille de la matrice peut fonctionner en 100 de - donc un algorithme qui est rapide ferait une énorme différence.

Merci beaucoup pour votre aide.

Répondre

2

Utilisez find pour obtenir des lignes, des colonnes et des valeurs; puis sortrows pour trier selon les valeurs:

[ii jj vv] = find(A); %// "A" denotes your matrix 
result = sortrows([vv ii jj], 1); %// "1" to sort rows according to column 1 
+0

Parfait! Merci beaucoup Luis. – user3785820

0

Il y a une fonction appelée découverte en Matlab il retournera indicis de tous les non zéro élém dans la matrice et l'élément. http://www.mathworks.com/help/matlab/ref/find.html Voici un exemple avec votre matrice.

A = [0 16.38028519 57.19639932 109.1383791 168.7622095;0 0 12.41026354 41.10752608 

80.27145093;0 0 0 8.356508551 29.60683208;0 0 0 0 6.510638154;0 0 0 0 0]; 
[r,c,v] = find(A); 
B(:,1) = v(:); 
B(:,2) = r(:); 
B(:,3) = c(:); 

disp(' Data  RowNum ColNum'); 
disp(sortrows(B,1)); 

ici est la mise sur:

>> printtable 
    Data  RowNum ColNum 
    6.5106 4.0000 5.0000 
    8.3565 3.0000 4.0000 
    12.4103 2.0000 3.0000 
    16.3803 1.0000 2.0000 
    29.6068 3.0000 5.0000 
    41.1075 2.0000 4.0000 
    57.1964 1.0000 3.0000 
    80.2715 2.0000 5.0000 
    109.1384 1.0000 4.0000 
    168.7622 1.0000 5.0000 
+0

Merci beaucoup pour illustrer l'utilisation de la fonction avec mon exemple. – user3785820

Questions connexes