获取唯一坐标对

时间:2017-02-06 12:43:24

标签: matlab loops if-statement for-loop matrix

请为我的代码提供帮助。

我有一个矩阵A [53x3],其中我的前两列是各点的坐标X和Y,第三列是重量。在该矩阵中,一些线以双线(或三线)存在,并且仅在第三列(X和Y相同)中不同。 我想创建一个矩阵B,只有单个和权重最低的行。

在算法的层面上,我有想法通过循环来实现这一点,并且如果在内存中保留多少行是相同的并且在直接转到不同的行之后。也就是说,我希望我的代码读取矩阵,然后它将第一行与第二行进行比较。如果它们与矩阵B中写的行不同。如果它们相同,则查看第三行。如果第三个是不同的,它已经采用了权重并比较它们并输入了线,权重是矩阵B中的最小值。 (以及整个矩阵的内容)。

lengthA = size(A);

for i = 1:lengthA(1)-1
    for j = i+1:lengthA(1)

        if (ismember(A(i,1),A(j,1))) && (ismember(A(i,2),A(j,2)))
            M = [A(i,3) A(j,3)];
            m = min(M);
            Res(i,:) = A(m,:);
        else
            Res(i,j) = A;
        end

    end
end

我尝试过这段代码但是没有工作

2 个答案:

答案 0 :(得分:1)

您可以使用accumarray@min来获取最小值

[uA, ~, ind] = unique(A(:,1:2), 'rows', 'stable');
B = [uA accumarray(ind, A(:,3), [], @min)];

更新

如果您只想使用forif,则可以使用此变体。我使用变量coordToCheck来避免重新检查坐标对。

N = size(A,1);
coordToCheck = true(N,1);
Res = [];

for i = 1:N
    if coordToCheck(i)
        minVal = A(i,3);
        for j = i+1:N
            if coordToCheck(j)
                if isequal(A(i,[1 2]), A(j,[1 2]))
                    coordToCheck(j) = false;
                    % Update min value
                    minVal = min(minVal, A(j,3));
                end
            end
        end
        % Add corrdinates and min value
        Res(end+1,:) = [A(i,[1 2]), minVal];
    end
end

答案 1 :(得分:0)

您可以使用sortrows作为权重,unique使用前2列,例如:

[As, is] = sortrows(A);
[Au, iu] = unique(As(:,1:2), 'rows', 'first');
B = A(sort(is(iu)), :);

最后一个sort只是为了保留原始元组的顺序。