矩阵变换

Sha*_*ien 3 matlab matrix

我正在开发一个项目,我需要将结果矩阵转换为更简单的矩阵.更具体地说,对于矩阵中的每一列,我想在行中找到最大值并将其更改为1,其余值将更改为0.我不知道如何搜索此问题,所以我决定发布在这里.

例如,我有一个矩阵X:

X = [2 8 4; 7 3 9;1 2 3];
X = 2 8 4
    7 3 9
    1 2 3
Run Code Online (Sandbox Code Playgroud)

我想把这个矩阵转换成

X' = 0 1 0
     1 0 1
     0 0 0
Run Code Online (Sandbox Code Playgroud)

我只知道如何使用for循环从每一行返回最大值,但我不知道如何返回该值的矩阵中的位置并将其余部分转换为零.

这是我的想法

  1. 首先创建一个新的相同维度零矩阵
  2. 找到行中的最大值
  3. 找到最大值的位置
  4. 将值1分配到相同位置的新矩阵中
  5. 通过for循环重复2和3

我是Matlab的新手,希望你能提供帮助.

这是我的计划的结果之一

 2.0680   17.7410    0.8992   -3.0221
 3.6093    7.3443    6.7442    0.9874
-0.9095   -3.3220   -1.4857   -0.0023
-1.1753  -16.7906    0.3672    3.7697
-1.6856   -6.0929   -2.8614    0.5054
 1.0794    3.8352    1.9894    0.1686
-0.4584   -0.3923   -1.2525   -0.4761
Run Code Online (Sandbox Code Playgroud)

我希望这个矩阵转换成

0 1 0 0
1 0 1 0
0 0 0 0
0 0 0 1
0 0 0 0
0 0 0 0
0 0 0 0
Run Code Online (Sandbox Code Playgroud)

所以我认为max()不起作用的原因是因为矩阵内部有负值

其他没有使用max()第1列到第5列的示例

 0.3816   23.2243   19.6435   23.2243   -3.1993
 3.8674    8.0762    6.0563    8.0762    1.8475
-0.4442   -4.0758   -3.4244   -4.0758    0.2073
 0.7639  -22.3618  -19.1365  -22.3618    3.9892
-1.8128   -6.4602   -5.1011   -6.4602   -0.4536
 0.2954    3.5886    3.1529    3.5886   -0.1403
-0.3723    0.8057    0.6607    0.8057   -0.5173
Run Code Online (Sandbox Code Playgroud)

第5至10栏

 1.4814   19.6435    3.3100   23.2243    1.4814
 7.0255    6.0563    6.5251    8.0762    7.0255
-1.1483   -3.4244   -1.1448   -4.0758   -1.1483
-0.7784  -19.1365   -2.3904  -22.3618   -0.7784
-3.8880   -5.1011   -3.7437   -6.4602   -3.8880
 1.0289    3.1529    0.7994    3.5886    1.0289
-0.3723    0.8057    0.6607    0.8057   -0.5173
Run Code Online (Sandbox Code Playgroud)

第11至15栏

 21.3957   19.6435    1.4814    0.3816   -3.1993
 8.5765    6.0563    7.0255    3.8674    1.8475
-4.0793   -3.4244   -1.1483   -0.4442    0.2073
-20.7498  -19.1365   -0.7784    0.7639    3.9892
-6.6046   -5.1011   -3.8880   -1.8128   -0.4536
 3.8181    3.1529    1.0289    0.2954   -0.1403
 0.4994    0.6607   -0.5829   -0.3723   -0.5173
Run Code Online (Sandbox Code Playgroud)

第16至20栏

  -1.7736    9.5635   20.0251    1.8072    0.3816
   1.6114    7.0884    9.9237    3.6313    3.8674
  -0.0058   -2.3835   -3.8685   -0.6572   -0.4442
   2.1941   -8.7540  -18.3726   -1.0312    0.7639
  -0.5815   -4.5430   -6.9138   -1.9407   -1.8128
   0.1232    2.4470    3.4483    0.5589    0.2954
  -0.3588   -0.2377    0.2884   -0.2138   -0.3723
Run Code Online (Sandbox Code Playgroud)

正确的答案是使用bsxfun(@eq,output,max(output))

Jun*_*uxx 5

您可以使用bsxfun检查某个值是否等于其列的最大值.

X = bsxfun(@eq, X, max(X))
Run Code Online (Sandbox Code Playgroud)

有关更多说明,请参阅我上面链接的文档以及bsxfun如何工作的示例.


Rod*_*uis 5

不完全确定你的意思,但确实如此

>> bsxfun(@eq, X, max(X,[],2))  % maximum per row
ans =
     0     1     0
     0     0     1
     0     0     1
Run Code Online (Sandbox Code Playgroud)

接近?如果你的意思是每的最大值,那么就使用吧

>> bsxfun(@eq, X, max(X)) % maximum per column
ans =
     0     1     0
     1     0     1
     0     0     0
Run Code Online (Sandbox Code Playgroud)

  • Shawn,`max`肯定会继续工作,因为有些数据是双倍的.你能发布Rody答案无效的矩阵吗?并且还告诉我们您认为该矩阵应该正确的答案是什么? (2认同)