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を初めて使用します。助けていただければ幸いです。

これが私のプログラムの結果の1つです

 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 で wotk しない他の例

 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

正解は use 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 に答える