请为我的代码提供帮助。
我有一个矩阵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
我尝试过这段代码但是没有工作
答案 0 :(得分:1)
您可以使用accumarray
和@min
来获取最小值
[uA, ~, ind] = unique(A(:,1:2), 'rows', 'stable');
B = [uA accumarray(ind, A(:,3), [], @min)];
更新
如果您只想使用for
和if
,则可以使用此变体。我使用变量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
只是为了保留原始元组的顺序。