2014-05-15 266 views
2

所以我無法找到解決的簡單方法如下問題: 我有兩個矩陣具有相同數量的列:創建矩陣中的矩陣B的每一個元素髮現矩陣最接近元素A

A = [547 184 929 306; 
    296 368 776 509; 
    745 626 487 511; 
    189 780 436 818; 
    687 81 447 795] 
B = [644 939 208 195 311 980; 
    379 876 301 226 923 439; 
    812 550 471 171 430 111; 
    533 622 230 228 185 258; 
    351 587 844 436 905 409] 

如何創建矩陣C(size(C)= size(B)),其中矩陣B的每個元素從相應的行中找到矩陣A的最接近的元素。 在目前的情況下:

C = 

    547 929 184 184 306 929 
    368 776 296 296 776 509 
    745 511 487 487 487 487 
    436 780 189 189 189 189 
    447 687 795 447 795 447 

就目前而言,我只想到了這一點:

temp = bsxfun(@eq,abs(bsxfun(@minus,repmat(A,1,1,size(B,2)),permute(B,[1,3,2]))),min(abs(bsxfun(@minus,repmat(A,1,1,size(B,2)),permute(B,[1,3,2]))),[],2)); 

C = permute(sum(temp.*repmat(A,1,1,size(B,2)),2),[1,3,2]); 

那麼有沒有簡單的,更易於理解的方式來解決這個任務?

+1

是否有任何其他的問題與你有可讀性的解決方案嗎? – kkuilla

+0

我認爲你的實現正在做你想做的事情,如果你有可讀性方面的問題,你可以通過定義幫助變量來分割函數。否則,如果你真的不滿意你的解決方案檢查:[mathworks documentation:dsearchn](http://www.mathworks.de/de/help/matlab/ref/dsearchn.html)。這是一個鏈接到'dsearchn()'可以做到這一點。但我認爲TI搜索整個矩陣A而不是隻有一行 –

+0

不是,一切正常,只有大量相同的功能困擾我。即使計算時間也不錯。 – user3493862

回答

1

這三個bsxfun可以通過使用第二個輸出min,它給出了最小值(我的代碼的第一行)的位置減少到一個。然後,這些位置被轉換爲線性索引,其被施加到A(第二行):

[~, jj] = min(abs(bsxfun(@minus, permute(A, [1 3 2]), B)), [], 3); 
C = A(sub2ind(size(B), ndgrid(1:size(B,1),1:size(B,2)), jj)); 
1

還可以做使用最近鄰插值它:

for row = 1:size(A,1) 
    I = interp1(A(row,:), 1:size(A,2), B(row,:), 'nearest','extrap'); 
    C(row,:)=A(row,I); 
end