将每行中的最大元素设置为1,将其他元素设置为零

时间:2013-07-19 16:22:57

标签: matlab matrix

我在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

我想获得每行的最大元素并将它们设置为1,其余为零。所以

t2 = 

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

如何使用最少的命令执行此操作?

4 个答案:

答案 0 :(得分:3)

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)))

答案 1 :(得分:2)

这是一个替代的例子,不是很优雅......但仍然很好,也很容易理解。并完成工作。

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

答案 2 :(得分:0)

我不记得在MATLAB中直接说出这个的确切语法,但是这里是如何使用NumPy数组在Python中完成的,并且语法在MATLAB中或多或少完全相同。但是,您不会使用我用于扩展数组维度的None技巧。

(注意:我使用了我自己的随机数据集,而不是你的数据)

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.]])

答案 3 :(得分:0)

直截了当sparse,第二个输出参数max

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

或使用spconvert代替sparse

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

测试数据:

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