【问题标题】:Set the largest element in each row to be one and others zero将每行中的最大元素设置为 1,其他元素设置为 0
【发布时间】:2013-07-19 16:22:57
【问题描述】:

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

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

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    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】:

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

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

      【讨论】:

        【解决方案3】:

        我不记得在 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.]])
        

        【讨论】:

        • 在 Matlab 中:floor(t2./(max(t2,[],2)*ones(1,size(t2,2))))
        【解决方案4】:

        直接使用sparsemax 的第二个输出参数:

        [~,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
        

        【讨论】:

          猜你喜欢
          • 2018-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-30
          • 1970-01-01
          • 1970-01-01
          • 2021-12-05
          • 1970-01-01
          相关资源
          最近更新 更多