3
votes

I am working on a project in which I need to transform the result matrix to a simpler matrix. More specifically, for each column in matrix, I want to find the maximum value in row and change it to 1, and the rest of the values will be change to 0. I am not sure how to search this question so I decide to post it here.

For example, I have a matrix X:

X = [2 8 4; 7 3 9;1 2 3];
X = 2 8 4
    7 3 9
    1 2 3

and I want to transform this matrix to

X' = 0 1 0
     1 0 1
     0 0 0

I only know how to use for loop to return the maximum value from each row, but I am not sure how to return the position in matrix of that value and convert the rest to zero.

Here is my idea

  1. Create a new same dimension zero matrix first
  2. Find the maximum value in row
  3. Find the position of the maximum value
  4. Assign the value 1 into new matrix at same position
  5. Repeat 2 and 3 by for loop

I am new to Matlab, hope you can help.

Here is one of the result of my program

 2.0680   17.7410    0.8992   -3.0221
 3.6093    7.3443    6.7442    0.9874
-0.9095   -3.3220   -1.4857   -0.0023
-1.1753  -16.7906    0.3672    3.7697
-1.6856   -6.0929   -2.8614    0.5054
 1.0794    3.8352    1.9894    0.1686
-0.4584   -0.3923   -1.2525   -0.4761

And I want this matrix transform to

0 1 0 0
1 0 1 0
0 0 0 0
0 0 0 1
0 0 0 0
0 0 0 0
0 0 0 0

So I think the reason why max() not work is becuase I have negative value inside the matrix

Other example which not wotk with max() Columns 1 through 5

 0.3816   23.2243   19.6435   23.2243   -3.1993
 3.8674    8.0762    6.0563    8.0762    1.8475
-0.4442   -4.0758   -3.4244   -4.0758    0.2073
 0.7639  -22.3618  -19.1365  -22.3618    3.9892
-1.8128   -6.4602   -5.1011   -6.4602   -0.4536
 0.2954    3.5886    3.1529    3.5886   -0.1403
-0.3723    0.8057    0.6607    0.8057   -0.5173

Columns 5 through 10

 1.4814   19.6435    3.3100   23.2243    1.4814
 7.0255    6.0563    6.5251    8.0762    7.0255
-1.1483   -3.4244   -1.1448   -4.0758   -1.1483
-0.7784  -19.1365   -2.3904  -22.3618   -0.7784
-3.8880   -5.1011   -3.7437   -6.4602   -3.8880
 1.0289    3.1529    0.7994    3.5886    1.0289
-0.3723    0.8057    0.6607    0.8057   -0.5173

Columns 11 through 15

 21.3957   19.6435    1.4814    0.3816   -3.1993
 8.5765    6.0563    7.0255    3.8674    1.8475
-4.0793   -3.4244   -1.1483   -0.4442    0.2073
-20.7498  -19.1365   -0.7784    0.7639    3.9892
-6.6046   -5.1011   -3.8880   -1.8128   -0.4536
 3.8181    3.1529    1.0289    0.2954   -0.1403
 0.4994    0.6607   -0.5829   -0.3723   -0.5173

Columns 16 through 20

  -1.7736    9.5635   20.0251    1.8072    0.3816
   1.6114    7.0884    9.9237    3.6313    3.8674
  -0.0058   -2.3835   -3.8685   -0.6572   -0.4442
   2.1941   -8.7540  -18.3726   -1.0312    0.7639
  -0.5815   -4.5430   -6.9138   -1.9407   -1.8128
   0.1232    2.4470    3.4483    0.5589    0.2954
  -0.3588   -0.2377    0.2884   -0.2138   -0.3723

The correct answer is use bsxfun(@eq, output, max(output))

2
You say "maximum per row", but you show "maximum per column"...which do you mean?Rody Oldenhuis
@RodyOldenhuis Sorry I make a mistake, it should be for each column in matrix, find the row with maximum value, convert it to 1, convert rest of rows to 0. So should be ColumnShawn Lien

2 Answers

5
votes

You can use bsxfun to check whether a value is equal to the max of its column.

X = bsxfun(@eq, X, max(X))

See the documentation I linked to above for more explanation and an example of how bsxfun works.

5
votes

Not entirely sure what you mean, but does

>> bsxfun(@eq, X, max(X,[],2))  % maximum per row
ans =
     0     1     0
     0     0     1
     0     0     1

Come close? If you mean the maximum per column, then just use

>> bsxfun(@eq, X, max(X)) % maximum per column
ans =
     0     1     0
     1     0     1
     0     0     0