2011-07-20 8 views
0

J'ai une grande matrice 4 dimensions, et je souhaite 1) trouver le minimum de 2 de ces dimensions (soit un résultat 4000x4000) puis 2) compter le nombre d'éléments dans ces deux dernières dimensions sont inférieures à (disons) 5 fois le minimum (soit un résultat de 4000x4000). Je suis un peu perplexe quant à la façon de le faire sans revenir à des bouclesÉviter les boucles for dans cette opération matricielle Matlab

Certains code pourrait aider ma description:

A  = rand([4000,4000,7,7]); 
B(:,:) = min(A(:,:,1:7;1:7)); % this isn't quite right? 
C  = size(A < 5*B) % obviously totally wrong 

des pointeurs serait génial - merci beaucoup!

+0

Si vous écrivez ce for-loop, cela nous donnera une meilleure idée de ce que vous essayez de faire – Amro

+1

Vous pourriez envisager d'utiliser 'prctile' plutôt qu'un multiple fixe de la valeur minimale. Juste une pensée. –

Répondre

2

Si je comprends correctement, ce qui suit devrait faire le travail:

mn = min(min(A,[],3),[],4); 
num = sum(sum(bsxfun(@lt, A, 5*mn),3),4) 
+0

Je pense que la réponse d'Amro est exactement ce que je veux, avec la légère modification de changer 1 et 2 à 3 et 4, soit num = sum (somme (bsxfun (@lt, A, 5 * mn), 3), 4) – trican

+1

@yoda, je ne pense pas que vous ayez raison: A et mn ont des dimensions différentes, donc A <5 * mn échoue déjà. En outre, la solution d'Amro donne un tableau 1x1x7x7, alors que nnz ne donne qu'un seul nombre (la somme sur tous les 49 éléments). –

+0

@trican: si cette solution fonctionne pour vous, vous pouvez marquer comme la réponse acceptée :-). Si vous vouliez avoir un résultat 7x7 ou 4000x4000 n'était pas vraiment clair à partir de votre question, peut-être que vous pourriez éclaircir cela pour les futurs lecteurs de ce fil ;-). –

-1

Tout d'abord, il devrait être rand([4000,4000,7,7])

En second lieu, utiliser min, vous devez faire quelque chose comme min(A, [], 1) (remplacer 1 avec la dimension)

Troisièmement, en supposant que vous aviez A et B, vous voulez C = sum(sum(A < 5*B))

+2

Si A est 4D et B est 2D (comme les états OP) alors A <5 * B échoue ... –

Questions connexes