获取唯一坐标对的最小值



我的代码需要帮助。

我有一个矩阵A[53x3],其中我的前两列分别是点的坐标X和Y,第三列表示权重。在这个矩阵中,一些行存在于双(或三元组)中,并且仅在第三列(X和Y相同)中不同。我想创建一个矩阵B,只包含单个和具有最低权重的行。

在算法的层面上,我想通过for和if的循环来实现这一点,在内存中保留有多少行是相同的,然后直接转到不同的行。也就是说,我希望我的代码读取矩阵,然后将第一行与第二行进行比较。如果它们与矩阵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

我试过这个代码,但不工作

您可以使用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

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

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

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