3

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

例如,我有一个矩阵 X:

X = [2 8 4; 7 3 9;1 2 3];
X = 2 8 4
    7 3 9
    1 2 3

我想将此矩阵转换为

X' = 0 1 0
     1 0 1
     0 0 0

我只知道如何使用 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

我希望这个矩阵变换到

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

所以我认为 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

第 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

第 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

第 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

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

4

2 回答 2

5

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

X = bsxfun(@eq, X, max(X))

请参阅我上面链接的文档以获取更多说明和 bsxfun 工作原理的示例。

于 2012-11-08T15:42:44.480 回答
5

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

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

接近?如果您的意思是每的最大值,那么只需使用

>> bsxfun(@eq, X, max(X)) % maximum per column
ans =
     0     1     0
     1     0     1
     0     0     0
于 2012-11-08T15:43:20.403 回答