2015-02-10 64 views
1

只是一個矩陣問題,可能很簡單,我無法弄清楚。假設我有一個20×20的矩陣A.我有另一個矩陣B,它是相同的大小但是是邏輯的。我想在阿那位置內的任何元素(比如說)的「1」在乙3,將被改變爲0。MATLAB基於周圍數據將元素更改爲零

詹姆斯

+1

你如何衡量矩陣元素之間的距離? – David 2015-02-10 00:49:15

回答

2

所述的圖像處理工具箱包括功能imdilate,可以填補在B附近的位置1 s也是1 s。然後我們只使用A的邏輯索引。你提到的距離是使用歐幾里德距離計算的。如果您想要棋盤距離,請改爲使用neighborhood = ones(2*R+1)

R = 3; 
[X,Y] = ndgrid(-ceil(R):ceil(R)); 
neighborhood = (X.^2 + Y.^2)<=R^2; 
A(imdilate(B,neighborhood)) = 0; 
2

代碼

bsxfun基礎的辦法來解決這樣的問題 -

%// Form random A and B for demo purposes 
N = 50;   %// input datasize 
A = rand(N); 
B = rand(N)>0.9; 
R = 2;    %// neighbourhood radius 

%// Find linear indices offsets within 2R*2R neighbourhood 
offset_displacement = bsxfun(@plus,(-R:R)',[-R:R]*size(A,1)); %//' 
offset_matches = bsxfun(@plus,(-R:R)'.^2,[-R:R].^2) <= R*R; %//' 
offset_matched_displacement = offset_displacement(offset_matches); 

%// Use those offsets to find actual linear indices for all '1' points in B 
loc = bsxfun(@plus,find(B),offset_matched_displacement');    %//' 

%// Set "eligible" points (based on loc) to zeros in A 
A(loc(loc>=1 & loc<=numel(A)))=0; 

調試輸入&輸出 -

enter image description here

enter image description here

enter image description here

+0

Matlab總是被稱讚它的工具箱,實際上你所需要的只是'bsxfun'。 :-) – knedlsepp 2015-02-10 17:37:26

+0

@knedlsepp這正是我告訴別人的!其實對於這個問題'conv2'可能是最有效的,因爲即使使用這個'bsxfun',也有多個覆蓋! – Divakar 2015-02-10 17:39:17

+0

哦,對,只是測試它。最多N = 500次「conv2」擊敗「imdilate」。根據您迄今爲止的所有答案,可以將圖像處理工具箱的免費版本與可比較的速度結合起來。 :-) – knedlsepp 2015-02-10 17:53:22