使用MATLAB,我有一个大小为8行x N列的值数组.我需要创建一个相同大小的矩阵,它计算每列中的最大值,并在包含最大值的单元格中放置1,在其他地方放置0.
一个小例子.让我们假设我们有一个值数组D:
D =
0.0088358 0.0040346 0.40276 0.0053221
0.017503 0.011966 0.015095 0.017383
0.14337 0.38608 0.16509 0.15763
0.27546 0.25433 0.2764 0.28442
0.01629 0.0060465 0.0082339 0.0099775
0.034521 0.01196 0.016289 0.021012
0.12632 0.13339 0.11113 0.10288
0.3777 0.19219 0.005005 0.40137
Run Code Online (Sandbox Code Playgroud)
然后,这种矩阵D的输出矩阵将是:
0 0 1 0
0 0 0 0
0 1 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 1
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有从max函数中捕获索引的向量然后使用for循环将其放在正确的位置?
单行答案:
M = D==repmat(max(D),size(D,1),1)
Run Code Online (Sandbox Code Playgroud)
或者更优雅:
M = bsxfun(@eq, D, max(D))
Run Code Online (Sandbox Code Playgroud)
根据评论,如果您希望保持安全并捕获意外的非唯一最大值,请添加以下语句:
M( cumsum(M)>1 ) = false
Run Code Online (Sandbox Code Playgroud)
这将确保在多个最大值的情况下,只有第一个出现在输出矩阵中具有相应的一个(这相当于max()函数的返回索引的行为).
可能有更好的方法,我的第一种方法是:
D = rand(8,4)
[val, sub] = max(D)
ind = sub2ind( size(D), sub, 1:4 )
res = false( size(D) )
res( ind ) = true
Run Code Online (Sandbox Code Playgroud)