矩阵变换

时间:2012-11-08 15:35:36

标签: 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

我希望将此矩阵转换为

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

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

这是我的想法

  1. 首先创建一个新的相同维度零矩阵
  2. 查找行中的最大值
  3. 找到最大值的位置
  4. 将值1分配到同一位置的新矩阵
  5. 通过for循环重复2和3
  6. 我是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))

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分: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