【问题标题】:Matlab: find diagonal neighborsMatlab:找到对角线邻居
【发布时间】:2019-12-05 19:25:58
【问题描述】:

我有一个大小为 (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 对。

【问题讨论】:

标签: matlab


【解决方案1】:

除了已经提到的预分配之外,这里是您的算法的一个小变体,可以满足您的需求:

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))。一个小的变化,你不再有角落案例。插入四个元素的正方形内的两个相邻关系。

【讨论】:

    【解决方案2】:

    您可以矢量化您的代码。

    以下代码获取您的 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)
    

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 2020-01-29
      • 2020-03-05
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      相关资源
      最近更新 更多