0

重複の可能性:
Matlab、ifステートメントを使用して配列を比較

やあみんな私は次のような配列を持っています

A = [2 4 6 8 ; 3 5 7 9 ; 1 4 6 9]

row_median = [ 5 6 5 ]
col_median = [ 2 4 6 9 ]

このデータから、と呼ばれる別の配列を作成したいと思いますMedianMap。次の条件下で、配列内のすべての値を対応する行と列の中央値と比較するために、IFステートメントを使用する必要があります(のような簡単な方法があることはわかってmeshgridいますが、この方法を知りたいです) 。A

  • 値が行と列の中央値の両方より大きい場合、中央値マップに「1」が割り当てられます
  • 値が行と列の中央値の両方よりも小さい場合、中央値マップに「-1」が割り当てられます
  • それ以外の場合は0
4

2 に答える 2

2

これもbsxfunの仕事です:

 result = zeros(size(A));
 result( bsxfun(@gt,A,row_median') & bsxfun(@gt,A,col_median) ) =  1;
 result( bsxfun(@lt,A,row_median') & bsxfun(@lt,A,col_median) ) = -1;
于 2012-10-04T06:04:36.697 に答える
2

あなたはかなり新しいユーザーのようです。SO へようこそ。2 つのこと: 1) 私または他の誰かがあなたの質問に回答したと思われる場合は、回答の横にあるチェック マークをクリックしてください。2番に関しては、うーん…

2) これは宿題の質問のように聞こえます (つまり、より良い方法があることを知っていても、IF ステートメントを使用したいという事実)。このような場合は、少なくとも自分で問題を解決しようとしたことを質問で示した場合、人々が助けを提供する可能性が高くなることを今後の参考のために注意してください.

これが宿題ではない場合のために、ここに 2 つの解決策があります (1 つは IF ステートメントを使用し、もう 1 つは使用しません)。

%#Setup
A = [2 4 6 8 ; 3 5 7 9 ; 1 4 6 9];
Med1 = median(A, 1); %median of each column
Med2 = median(A, 2); %median of each row
T = size(A, 1);
N = size(A, 2);

%#Your IF solution
MedianMap2 = NaN(T, N);
for t = 1:1:size(A, 1)
    for n = 1:1:size(A, 2)
        if A(t, n) > Med1(1, n) && A(t, n) > Med2(t, 1)
            MedianMap2(t, n) = 1;
        elseif A(t, n) < Med1(1, n) && A(t, n) < Med2(t, 1)
            MedianMap2(t, n) = -1;
        else
            MedianMap2(t, n) = 0;
        end
    end
end

%#A better solution
I1 = (A > ones(T, 1) * Med1) .* (A > Med2 * ones(1, N));
I2 = (A < ones(T, 1) * Med1) .* (A < Med2 * ones(1, N));
MedianMap1 = zeros(T, N) + I1 - I2;

%#Print output
MedianMap1
于 2012-10-04T02:29:52.013 に答える