簡體   English   中英

Matlab:找到對角線鄰居

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM