0
 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 列具有相同的数字组合,我该如何对其进行编码,以便仅删除其中一行?我尝试了独特的功能,但它并没有真正删除组合。我读过关于从以前的帖子中删除重复的内容,但那些让我更加困惑。关于如何解决这个问题的任何帮助都会对我有很大帮助!

谢谢

4

2 回答 2

1

欢迎来到 StackOverflow。

您的代码中的问题似乎是,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语句涵盖之前未包含的任何其他情况,因此它们不需要条件。

一些性能建议:

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

问候,

克里斯

于 2018-10-09T23:48:44.453 回答
0

您还可以线性化您的算法(但我们仍在使用蛮力):

[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

现在您可以真正使用数学优化您的算法,您应该阅读这个问题。如果 n>>50,它将很有用。

于 2018-10-10T10:32:48.643 回答