4

私は自分が抱えているこの問題の答えを見つけようとしてネットを検索しました。

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

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 = int8(zeros(MAX_ROWS, MAX_COLS))

この配列内で、1、0、-1の3つの異なる値を割り当てたいと思います。したがって、マップ出力の中央値は、配列'A'と同じサイズになります。

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

「A」配列のすべての行と列をトラバースして、それぞれの列と行の中央値に関連付けるにはどうすればよいですか?

私はコードをCコードで記述しましたが、成功しましたが、Matlabで苦労しました。

4

3 に答える 3

1

これが私がそれをする方法です:

  1. 各条件の論理インデックスを作成します(行/列の中央値よりも大きい/小さい要素)
  2. 論理インデックスを使用して、MedianMapを更新します。

コード内:

[xMedian, yMedian] = meshgrid(col_median, row_median);

isRowHigh = (A > yMedian);
isColHigh = (A > xMedian);

isRowLow = (A < yMedian);
isColLow = (A < xMedian);

MedianMap(isRowHigh & isColHigh) = 1;
MedianMap(isRowLow & isColLow) = -1;

ノート:

  • meshgridrow_mediancol_median同じサイズの配列に拡張されますA
  • A > yMedianのすべての要素をの対応する要素とA比較したブール結果を含むのと同じサイズの行列を返します。AxMedian
  • isRowHigh & isColHighブール行列の要素ごとのANDを実行します
  • MedianMap(L)、ここLで、は論理インデックス(ブール行列)であり、の要素が真であるにMedianMap対応するの要素を選択します。L
于 2012-10-02T02:10:05.760 に答える
1

これが私がそれを行う方法です:

MedianMap = ...
    ( bsxfun(@gt,A,col_median) & bsxfun(@gt,A,row_median.') ) - ...
    ( bsxfun(@lt,A,col_median) & bsxfun(@lt,A,row_median.') );

これはマルチスレッドであり(はるかに大きな問題に適しています)、他の回答に含まれる一時的なものはありません(ピークメモリフットプリントがはるかに小さい)。

ただし、あまりきれいではありません:)したがって、読みやすさを向上させたい場合はmeshgrid、BrianLの回答のように使用するか、次のいずれかを使用しrepmatます。

Col_median = repmat(col_median, size(A,1),1);
Row_median = repmat(row_median.', 1, size(A,2));

MedianMap = ...
    ( A > Col_median & A > Row_median ) - ... 
    ( A < Col_median & A < Row_median ); 

または Rasman が行ったように、ones-matrix による乗算:

Col_median = ones(size(A,1),1) * col_median;
Row_median = row_median.' * ones(1,size(A,2));

MedianMap = ...
    ( A > Col_median & A > Row_median ) - ... 
    ( A < Col_median & A < Row_median ); 
于 2012-10-02T04:59:52.680 に答える
-1
MedianMap  = (A > Rmedian'*ones(1,4))+ ( A > ones(3,1)*Cmedian) -1
于 2012-10-02T02:12:12.103 に答える