我在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
如何使用最少的命令执行此操作?
答案 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