2012-10-02 79 views
4

我已經搜索了網絡,試圖找到我遇到的這個問題的答案。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 = int8(zeros(MAX_ROWS, MAX_COLS)) 

在這個數組中,我想分配三個不同的值:1,0,0,-1。因此,中值映射輸出將是陣列的「A」具有相同的尺寸:

  • 如果該值大於兩個行和列中值大於「1」被分配給位圖
  • 如果值小於行和列中值a「-1」被分配給中值圖
  • 否則爲0?

如何遍歷「A」數組中的每一行和列,並將其與其各自的列和行中位數相關聯?

我已經用C代碼編寫了代碼,它成功了,但是隻是在Matlab中掙扎。

回答

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; 

注:

  • meshgrid膨脹row_mediancol_median成相同大小的數組作爲A
  • A > yMedian返回相同的尺寸A的矩陣包含比較的每個元素的布爾結果與相應的元素xMedian
  • isRowHigh & isColHigh執行逐元素的布爾矩陣
  • MedianMap(L),其中L是邏輯索引(布爾矩陣)的AND,選擇的MedianMap對應於爲真的L的元素的元素。
-1
MedianMap = (A > Rmedian'*ones(1,4))+ (A > ones(3,1)*Cmedian) -1 
+0

-1:這不是OP想要的.. –

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做:

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);