2017-10-03 5 views
2

Disons que j'ai une matrice 4 dimensions, à partir de laquelle je voudrais récupérer les valeurs maximales sur la 2ème et 3ème dimension.MATLAB stocker indices maximum dans la matrice logique

A = rand(4, 4, 4, 4); 
[max_2, in_2] = max(A, [], 2); 
[max_3, in_3] = max(max_2, [], 3); 

Comment pourrais-je utiliser ind_2 et ind_3 pour obtenir une matrice 4 logique dimensionnelle, où une entrée 1 signifie cette entrée est maximale dans la 2ème et 3ème dimension?

Répondre

1

est ici une approche de travail avec des indices linéaires et utilise des indices Argmax de max fonction, il serait donc seulement considérer la première arg en cas d'égalité pour la valeur maximale -

% Get size parameters 
[m,n,p,q] = size(A); 

% Reshape to merge second and third dims 
[~, in_23] = max(reshape(A,m,[],q), [], 2); 

% Get linear indices equivalent that could be mapped onto output array 
idx1 = reshape(in_23,m,q); 
idx2 = bsxfun(@plus,(1:m)', m*n*p*(0:q-1)) + (idx1-1)*m; 

% Initialize output array an assign 1s at linear indices from idx2 
out = false(m,n,p,q); 
out(idx2) = 1; 

Explication avec un échantillon

1) tableau d'entrée:

>> A 
A(:,:,1,1) = 
    9  8 
    9  1 
A(:,:,2,1) = 
    2  9 
    8  1 
A(:,:,1,2) = 
    1  7 
    8  1 
A(:,:,2,2) = 
    8  5 
    9  7 

2) Remodelez réseau pour une meilleure visualisation:

>> reshape(A,m,[],q) 
ans(:,:,1) = 
    9  8  2  9 
    9  1  8  1 
ans(:,:,2) = 
    1  7  8  5 
    8  1  9  7 

3) La question est de prendre la valeur maximale de chacune des rangées. Pour cela, nous avions idx2 comme les indices linéaires:

>> idx2 
idx2 = 
    1 13 
    2 14 

Retour sur la version Reshape, donc nous avons choisi (les crochets) -

>> reshape(A,m,[],q) 
ans(:,:,1) = 
    [9]  8  2  9 
    [9]  1  8  1 
ans(:,:,2) = 
    1  7  [8]  5 
    8  1  [9]  7 

Ainsi, en regardant de près, nous voyons que pour la première rangée, nous avons eu deux 9s, mais nous choisissons le premier seulement.

4) Enfin, nous attribuons ces derniers dans le tableau de sortie initialisé sous forme de zéros logiques:

>> out 
out(:,:,1,1) = 
    1  0 
    1  0 
out(:,:,2,1) = 
    0  0 
    0  0 
out(:,:,1,2) = 
    0  0 
    0  0 
out(:,:,2,2) = 
    1  0 
    1  0 
+0

Les deux correctes et rapides. – user1111652

2

J'utiliser cette approche:

A = rand(4, 4, 4, 4); % example data 
B = permute(A, [1 4 2 3]); % permute dims 2 and 3 to the end 
B = reshape(B, size(A,1), size(A,4), []); % collapse last two dims 
C = bsxfun(@eq, B, max(B, [], 3)); % maximize over collapsed last dim 
C = reshape(C, size(A,1), size(A,4), size(A,2), size(A,3)); % expand dims back 
C = permute(C, [1 3 4 2]); % permute dims back. This is the final result 
+0

Très belle approche. Cependant, s'il y a plusieurs éléments dans A qui ont la valeur maximum dans la 2ème ou la 3ème dimension, je voudrais que le premier (aka la valeur d'index in_2 et in_3) soit 1. Le reste doit être 0. – user1111652

+0

@ user1111652 Merci. Dommage que votre question n'a pas précisé que –