2010-10-24 8 views
2

Disons que j'ai un vecteur a = [1 2 4]. Je veux qu'il soit converti en un vecteur qui ressemble à ceci b = [1 2 0 4], c'est-à-dire que chaque numéro est placé dans une position correcte et puisque 3 n'est pas inclus dans le vecteur a, il est remplacé par 0 dans le vecteur b. Cela peut être fait de la façon suivante:Conversion d'une matrice en MATLAB

a = [1 2 4] 
b = zeros(1, size(a, 2)); 
b(1, a) = a; 

Je ne peux pas trouver un moyen de faire la même chose pour une matrice. Par exemple,

c = [1 4 2 0; 3 1 0 0; 4 0 0 0; 1 3 4 0]; 

je dois convertir en une matrice qui ressemble à ceci:

d = [1 2 0 4; 1 0 3 0; 0 0 0 4; 1 0 3 4]; 

Des conseils? Comment cela peut-il être fait? Comment puis-je faire cela sans utiliser de boucles?

+0

Comment avez-b = zéros (1, taille (a, 2)); a (1, b) = b; réaliser le changement demandé? –

+0

Désolé, mon erreur. Corrigé ci-dessus. – Eduardas

Répondre

2

Voici une solution vectorisé:

a = [1 4 2 0; 3 1 0 0; 4 0 0 0; 1 3 4 0]; 
b = zeros(size(a,1),max(a(:))); 
[rowIdx,~] = find(a); 
vals = a(a>0); 
b(sub2ind(size(b),rowIdx,vals)) = vals; 
+0

Merci! Cela a l'air génial! – Eduardas

1

Est-ce que cela fonctionne? (Sous la direction: erreur fixe.)

[m,n] = size(c) 
d = zeros(m,n) 
for i=1:m 
    d(i,c(i,c(i,:)>0)) = c(i,c(i,:)>0) 
end 
+0

Y a-t-il un moyen de faire cela sans utiliser de boucle? Je travaille avec des ensembles de données très volumineux et les boucles ont tendance à être très lentes ... – Eduardas

+0

Je pense que c'est possible, mais dans ce cas, vous faites la même opération sur chaque ligne, donc il faut faire une boucle sur chaque ligne. Même pour les grandes matrices, je ne pense pas qu'une boucle rende la procédure extrêmement lente. –

+0

Pourriez-vous partager la solution non-look? – Eduardas

Questions connexes