2
votes

I have a matrix in MATLAB like

t2 =

    0.4366    0.4298    0.5907
    0.9401    0.5358    0.6136
    0.2305    0.5212    0.9759
    0.9545    0.5572    0.9042

I want to get the largest element on each row and set them to be one, the rest to be zero. So

t2 = 

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

How can I do that with the fewest commands?

4

4 Answers

3
votes

A one-liner in Matlab:

t2 = [0.4366 0.4298 0.5907;
      0.9401 0.5358 0.6136;
      0.2305 0.5212 0.9759;
      0.9545 0.5572 0.9042];
t2 = double(bsxfun(@eq, t2, max(t2, [], 2)))
2
votes

Here is an alternate example, not as elegant... but still nice and understandable. And gets the job done.

for i = 1:length(t2(:,1))
    t2(i,:)=t2(i,:)==max(t2(i,:));
end
0
votes

I'm not remembering the exact syntax for saying this in MATLAB right off hand, but here is how you can do it in Python with NumPy arrays, and the syntax will more or less be exactly the same in MATLAB. You won't use the None trick I've used to expand the array dimensions, though.

(Note: I used my own random set of data, not yours)

In [311]: t2/t2.max(axis=1)[:,None]
Out[311]:
array([[ 0.96452099,  0.19900529,  1.        ],
       [ 1.        ,  0.36581245,  0.91631999],
       [ 0.62747397,  0.96969966,  1.        ],
       [ 0.07238682,  0.59855665,  1.        ]])

In [312]: np.floor(t2/t2.max(axis=1)[:,None])
Out[312]:
array([[ 0.,  0.,  1.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [ 0.,  0.,  1.]])
0
votes

Straightforward with sparse and the second output argument to max:

[~,icol] = max(M,[],2);
B = full(sparse(1:size(M,1),icol,1,size(M,1),size(M,2)))

Or with spconvert instead of sparse:

B = full(spconvert([(1:size(M,1))',icol,ones(size(M,1),1);[size(M) 0]]))

Test data:

M = [0.4366,0.4298,0.5907;...
     0.9401,0.5358,0.6136;...
     0.2305,0.5212,0.9759;...
     0.9545,0.5572,0.9042]; % OP's t2