2012-04-25 4 views
0

je donne les résultats suivants:sélectionner des entrées et mettre dans une matrice sans boucle

b = [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] 

dont les dimensions sont variables.

b{1} 

ans = 

0  0  0  0 

Je veux mettre la première entrée de chacun des 10 vecteurs comme la première colonne de la matrice A

2ème colonne de la matrice A sera comme v la 1ère entrée de chacun des 10 vecteurs de r:

r = 

[1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] [1x4 double] 

r {1} -> ans = 10 10 10 10

C'est ce que je dois faire:

A = 

    v{1}(1) r{1}(1) 
    v{2}(1) r{2}(1) 
    v{3}(1) r{3}(1) 

Comment faire sans boucle est-il un moyen?

+0

Je ne suis pas sûr que je comprends cette question, mais regarde dans la fonction Matlab, cellfun (http://www.mathworks.com/help/techdoc/ref/cellfun.html) – Dan

+0

Le titre dit « select entrées et mettre dans une ** cellule ** sans boucle ", mais je suppose que vous voulez un mettre les entrées dans une ** matrice **, comme vous l'expliquez dans votre question. Est-ce que 'A' devrait être une ** matrice **, pas une ** cellule **? – nrz

Répondre

1

Quelques exemples de données:

b = {[ 101:104 ], [ 201:204 ], [ 301:304 ], [ 401:404 ], [ 501:504 ], [ 601:604 ], [ 701:704 ], [ 801:804 ], [ 901:904 ], [ 1001:1004 ]}; 

r = {[ 2101:2104 ], [ 2201:2204 ], [ 2301:2304 ], [ 2401:2404 ], [ 2501:2504 ], [ 2601:2604 ], [ 2701:2704 ], [ 2801:2804 ], [ 2901:2904 ], [ 3001:3004 ]}; 

Edit: une solution beaucoup plus rapide sans boucle en utilisant vertcat. Edit: correction d'une faute de frappe dans le code.

bMatrix = vertcat(b{:}); 
rMatrix = vertcat(r{:}); 
A = [ bMatrix(:,1), rMatrix(:,1) ]; 

beaucoup plus lent solution en utilisant cellfun (cellfun fait boucle):

A = [ cellfun(@(x) x(1), b)', cellfun(@(x) x(1), r)' ]; 

ou dans les parties:

ColumnOneOfMatrixA = cellfun(@(x) x(1), b)'; 
ColumnTwoOfMatrixA = cellfun(@(x) x(1), r)'; 
A = [ ColumnOneOfMatrixA, ColumnTwoOfMatrixA ]; 

Les deux façons donnent le même résultat.

A = 
    101  2101 
    201  2201 
    301  2301 
    401  2401 
    501  2501 
    601  2601 
    701  2701 
    801  2801 
    901  2901 
    1001  3001 
0

Comme le note Dan, cellfun est l'astuce pour éviter cette boucle.

%Setup test data 
for ix = 1:10 
    b{ix} = ones(1,4)*(ix-1); 
    r{ix} = ones(1,4)*(ix+9); 
end 

%Cellfun based definition of the "A" matrix 
A = [... 
    cellfun( @(x)x(1), b(1:10) ); ... 
    cellfun( @(x)x(1), r(1:10) ); ... 
    ]'; 

Voici les cellfun appels ont été mis en place pour retourner un tableau numérique containikng le premier élément de chaque tableau numérique dans le réseau de cellules. La fonction anonyme @(x)x(1) sert de noyau, renvoyant simplement le premier élément, et cellfun prend soin de mettre en œuvre la boucle appropriée sans vous déranger avec les détails. Notez que cellfun n'est généralement pas plus rapide que la boucle qu'il remplace. Il nécessite simplement moins de frappe, et est sans doute plus facile à lire après avoir appris à travailler avec.

+0

merci @Pursuit pour l'explication – pac

Questions connexes