2

我在 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,其余的设置为 0。所以

t2 = 

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

我怎样才能用最少的命令做到这一点?

4

4 回答 4

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)))
于 2013-07-19T17:44:24.347 回答
2

这是一个替代示例,没有那么优雅……但仍然很好且易于理解。并完成工作。

for i = 1:length(t2(:,1))
    t2(i,:)=t2(i,:)==max(t2(i,:));
end
于 2013-07-19T17:58:29.723 回答
0

我不记得在 MATLAB 中直接说这个的确切语法,但这里是你如何在 Python 中使用 NumPy 数组做到这一点,并且语法在 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.]])
于 2013-07-19T16:38:06.310 回答
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
于 2014-04-03T00:57:18.760 回答