如何从矩阵中删除具有相同数字的组合行并仅保留其中一个组合?

how I delete combination rows that have the same numbers from matrix and only keeping one of the combinations?

 for a=1:50; %numbers 1 through 50
    for b=1:50;
        c=sqrt(a^2+b^2);

        if c<=50&c(rem(c,1)==0);%if display only if c<=50 and c=c/1 has remainder of 0

           pyth=[a,b,c];%pythagorean matrix

           disp(pyth)
        else c(rem(c,1)~=0);%if remainder doesn't equal to 0, omit output

        end      
    end   
end

answer=
        3     4     5
        4     3     5
        5    12    13
        6     8    10
        7    24    25
        8     6    10
        8    15    17
        9    12    15
        9    40    41
       10    24    26
       12     5    13
       12     9    15
       12    16    20
       12    35    37
       14    48    50
       15     8    17
       15    20    25
       15    36    39
       16    12    20
       16    30    34
       18    24    30
       20    15    25
       20    21    29
       21    20    29
       21    28    35
       24     7    25
       24    10    26
       24    18    30
       24    32    40
       27    36    45
       28    21    35
       30    16    34
       30    40    50
       32    24    40
       35    12    37
       36    15    39
       36    27    45
       40     9    41
       40    30    50
       48    14    50

这道题涉及到勾股定理,但是我们不能使用内置函数,所以我不得不自己写一个。问题是例如前两行的第 1 列和第 2 列具有相同的数字。如果第 1 列和第 2 列具有相同的数字组合,我如何对其进行编码以便仅删除其中一行?我试过独特的功能,但它并没有真正删除组合。我读过有关从以前的帖子中删除重复项的信息,但那些让我更加困惑。任何关于如何解决这个问题的帮助都会对我有很大帮助!

谢谢

欢迎使用 Whosebug。

您的代码中的问题似乎是,pyth 仅包含 3 个值,[a, b, c]。在这种情况下,下一行中使用的 unique() 函数无效,因为 pyth 中只包含一行。另一个问题是,值 idxout 是在每个循环周期中计算的。这应该放在循环之后。示例代码可能如下所示:

pyth = zeros(0,3);

for a=1:50
    for b=1:50
        c = sqrt(a^2 + b^2);  
        if c<=50 && rem(c,1)==0
            abc_sorted = sort([a,b,c]);
            pyth = [pyth; abc_sorted];

        end
    end
end

% do final sorting outside of the loop
[~,idx]  = unique(pyth, 'rows', 'stable');
out = pyth(idx,:);
disp(out)

编写 MATLAB 代码的其他一些技巧:

  • 您不需要以分号结束 forif/else 语句
  • else statements涵盖之前未包含的任何其他情况,因此它们不需要条件。

一些性能推荐:

  • 由于 ab (a^2 + b^2 = b^2 + a^2) 的对称性,b 循环可以限制为 for b=1:a ,这将大致为您节省一半的循环周期。
  • 如果您使用 && 连接标量值,如果第一部分已经失败 (source),则不会计算第二部分。

此致,

克里斯

您也可以线性化您的算法(但我们仍在使用暴力破解):

[X,Y] = meshgrid(1:50,1:50);                             %generate all the combination
C     = (X(:).^2+Y(:).^2).^0.5;                          %sums of two square for every combination
ind   = find(rem(C,1)==0 & C<=50);                       %get the index
res   = unique([sort([X(ind),Y(ind)],2),C(ind)],'rows'); %check for uniqueness

现在您真的可以使用数学优化您的算法了,您应该阅读这篇文章 question。如果 n>>50.

会有用