Search code examples
matlabmultidimensional-arrayoctaveminimum

Minimum of two multidimensional matrices, with which matrix 'won' (contained the minimum)


I have two matrices (size 4x4) and I want to find the minimum between the two. For example:

A = [ 3, 2, 4, 5;              
      1, 2, 0, 6;                   
      9, 8, 5, 4;                   
      0, 1, 0, 3 ];               

B = [ 1, 1, 6, 8;
      0, 4, 6, 3;
      5, 6, 7, 1;
      0, 2, 3, 4 ];

Now, if I did a min(A,B) in Octave, it gives me

[ 1, 1, 4, 5;
  0, 2, 0, 3;
  5, 6, 5, 1;
  0, 1, 0, 3 ]

Is there a way to get the matrix that 'won', by which I mean which matrix contained the minimum, in each element-wise comparison?

Like, for the first element of both matrices, matrix B won and so on. I don't want to loop through the matrices.


Solution

  • You can compare A and B to find out in which matrix the minimum occurred. With A > B, you will get a matrix containing False if the entry from A was chosen, and True if the entry from B was chosen. By adding 1 to it, you will get 1 if A was chosen and 2 if B was chosen.

    >> 1 + (A > B)
    ans =
       2   2   1   1
       2   1   1   2
       2   2   1   2
       1   1   1   1
    

    Alternatively, you can concatenate A and B to form a 3-dimensional array with dimensions [4, 4, 2], where C(:, :, 1) = A and where C(:, :, 2) = B. Then you can call min on this matrix C along the third axis. When calling min on one matrix, you can get the index of the "winner" directly as a second return value:

    >> C = cat(3, A, B);
    >> [res, idx] = min(C, [], 3)
    res =
       1   1   4   5
       0   2   0   3
       5   6   5   1
       0   1   0   3
    
    idx =
       2   2   1   1
       2   1   1   2
       2   2   1   2
       1   1   1   1