[英]Matlab: find diagonal neighbors
我有一個大小為 (H, W) 的矩陣,我需要有一個 2xP 輸出,其中包含矩陣的所有對角鄰域,即對於每個 (i,j) 對都有 [(i,j); (i-1,j-1)] 和 [(i,j); (i-1,j+1)] 對(只有 2 對,不是 4,因為我不需要重復的鄰居對)。
矩陣的每個元素只是它在矩陣中的索引。
我嘗試了蠻力(僅針對這樣的兩個鄰居都存在的點進行了嘗試):
coord = reshape(1:w*h, h, w);
pairs = [];
for i=2:h-1
for j=2:w-1
pairs = [pairs [coord(i,j) coord(i, j); coord(i-1,j-1) coord(i-1, j+1)]];
end
end
但它太慢了。 在 Matlab 中重寫此代碼的智能快速方法是什么? 優選地,包括僅存在這樣的鄰居中的一個的情況(例如,第二行和最后一列:僅存在左上角鄰居但不存在右上角)。
對於 h=w=10,這段代碼給了我(我希望是正確的)128 對。
除了已經提到的預分配之外,這里是您的算法的一個小變化,可以滿足您的需求:
w=4
h=5
coord = reshape(1:w*h, h, w);
pairs = [];
k=1;
pairs=nan(2,(w-1*h-1))
for i=1:h-1
for j=1:w-1
pairs(:,k:k+1)=[coord(i+1,j+1) coord(i+1, j); coord(i,j) coord(i, j+1)];
k=k+2;
end
end
您的想法是為給定元素( coord(i,j)
)插入鄰居。 一個小的變化,你不再有極端情況。 插入四個元素的正方形內的兩個相鄰關系。
您可以矢量化您的代碼。
以下代碼采用您的 for 循環索引,並將每個索引放在單獨的矩陣中:
A = (coord(2:end-1, 2:end-1))'; %coord(i,j)
B = A; %coord(i,j)
C = (coord(1:end-2, 1:end-2))'; %coord(i-1,j-1)
D = (coord(1:end-2, 3:end))'; %coord(i-1,j+1)
以下部分以所需格式交織數據:
P = zeros(2, (w-2)*(h-2)*2);
P(1, 1:2:end) = A(:);
P(1, 2:2:end) = B(:);
P(2, 1:2:end) = C(:);
P(2, 2:2:end) = D(:);
這是一個完整的工作(測試)代碼示例:
h = 10;
w = 10;
coord = reshape(1:w*h, h, w);
%Original loop (kept for testing).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pairs = [];
for i=2:h-1
for j=2:w-1
pairs = [pairs [coord(i,j) coord(i, j); coord(i-1,j-1) coord(i-1, j+1)]];
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A = (coord(2:end-1, 2:end-1))'; %coord(i,j)
B = A; %coord(i,j)
C = (coord(1:end-2, 1:end-2))'; %coord(i-1,j-1)
D = (coord(1:end-2, 3:end))'; %coord(i-1,j+1)
P = zeros(2, (w-2)*(h-2)*2);
P(1, 1:2:end) = A(:);
P(1, 2:2:end) = B(:);
P(2, 1:2:end) = C(:);
P(2, 2:2:end) = D(:);
%Verify result is the same:
isequal(P, pairs)
這是一個更緊湊的解決方案:
P = zeros(2, (w-2)*(h-2)*2);
P(1, 1:2:end) = reshape(coord(2:end-1, 2:end-1)', 1, (w-2)*(h-2)); %coord(i,j)
P(1, 2:2:end) = P(1, 1:2:end); %coord(i,j)
P(2, 1:2:end) = reshape((coord(1:end-2, 1:end-2))', 1, (w-2)*(h-2)); %coord(i-1,j-1)
P(2, 2:2:end) = reshape((coord(1:end-2, 3:end))', 1, (w-2)*(h-2)); %coord(i-1,j+1)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.