Как удалить строки комбинации, которые имеют одинаковые номера из матрицы и сохраняя только одну из комбинаций? - PullRequest
0 голосов
/ 10 октября 2018
 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 имеют одинаковую комбинацию чисел?Я попробовал уникальную функцию, но она не удаляет комбинации.Я читал об удалении дубликатов из предыдущих постов, но они смутили меня еще больше.Любая помощь в том, как решить эту проблему, поможет мне безмерно!

Спасибо

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы также можете линеаризовать свой алгоритм (но мы все еще используем bruteforce):

[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.

0 голосов
/ 10 октября 2018

добро пожаловать в StackOverflow.

Проблема в вашем коде заключается в том, что pyth содержит только 3 значения, [a, b, c].Функция unique(), используемая в следующей строке, в этом случае не действует, поскольку в pyth содержится только одна строка.Другая проблема заключается в том, что значения idx и out рассчитываются в каждом цикле цикла.Это должно быть размещено после петель.Пример кода может выглядеть следующим образом:

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:

  • Вам не нужно заканчивать for или if / else содержит точку с запятой
  • else заявления охватывают любой другой случай, не включенный ранее, поэтому они не нуждаются в условии.

Некоторые рекомендации по производительности:

  • Из-за симметрии a и b (a ^ 2 + b ^ 2 = b ^ 2 + a ^ 2) цикл b может быть ограничен до for b=1:a,что примерно сэкономит вам половину циклов цикла.
  • , если вы используете && для объединения скалярных значений, вторая часть не оценивается, если первая часть уже дает сбой ( source ).

С уважением,

Крис

...