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
Les deux correctes et rapides. – user1111652