2012-10-04 115 views
0

可能重複:
Matlab, comparing array using if statementMatlab的:比較陣列其他數組

嗨我有一個數組就像下面

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
+0

另請參見:[你有什麼嘗試](http://mattgemmell.com/2008/12/08/what-have-you-tried/)? –

回答

2

你似乎是一個相當新的用戶,所以歡迎來到SO。兩件事:1)如果您認爲我或其他人回答了您的問題,請點擊答案旁邊的勾號。至於第二個,那麼...

2)這聽起來像一個家庭作業問題(即即使你知道有更好的方法你想使用IF語句的事實)。如果是這種情況,請注意以備參考,如果您在問題中證明您至少嘗試自己解決問題,那麼人們更可能提供幫助。

在的機會,這不是一門功課的問題,這裏有兩個解決方案(一個if語句,其他沒有):

%#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 
+0

首先,你一直在幫助很大。其次,你如何打印中位數圖?對於t = 1:1: – user1713288

+0

對於n = 1:1:尺寸(A,1):尺寸(A,2)fprintf('MedianMap%d \ n',MedianMap);末端 – user1713288

+0

是那條線?因爲它顯示錯誤 – user1713288

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; 
+0

OP已經問過這個問題了,我給出了正確的答案:)無論如何,現在他想要做同樣的事情,但*與*如果'陳述由於某種原因,嚴格來說......這不是對這個問題的回答。 –

+0

是啊,在發佈這篇文章之後,通過您的評論來看看,並注意到了這一點,留下來指出bsxfun是爲此而構建的。 –

+0

不管用什麼方式都可以。這是要走的路,'if'陳述只是一些愚蠢的家庭作業約束。 –