Выведите 1, 0,5 или 0 в зависимости от того, просты ли матричные элементы, 1 или ни того, ни другого - PullRequest
0 голосов
/ 19 февраля 2019

Я отправляю матрицу в свою функцию modifikuj, где я хочу заменить элементы матрицы на:

  • 1, если элемент является простым числом
  • 0если элемент является составным числом
  • 0,5, если элемент равен 1

Я не понимаю, почему он не работает.Я только начал с MATLAB и создал эту функцию:

function B = modifikuj(A)
    [n,m] = size(A);
    for i = 1:n
        for j = 1:m
            prost=1;
            if (A(i,j) == 1)
                A(i,j) = 0.5;
            else
                for k = 2:(A(i,j))
                    if(mod(A(i,j),k) == 0)
                        prost=0;
                    end
                end            
                if(prost==1)
                    A(i,j)=1;
                else 
                    A(i,j)=0;
                end
            end
        end
    end

С

A = [1,2;3,4]; 
D = modifikuj(A);

D должно быть:

D=[0.5, 1; 1 0]; 

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

В дополнение к ответу @ EuanSmith.Вы также можете использовать встроенную функцию Matlab, чтобы определить, является ли число простым или нет.

Следующий код даст вам желаемый результат:

A = [1,2;3,4];

A(A==1) = 0.5;                %replace 1 number with 0.5
A(isprime(A)) = 1;            %replace prime number with 1
A(~ismember(A,[0.5,1])) = 0;  %replace composite number with 0

Я сделалпредположение, что матрица содержит только целое число.

Если вы хотите только изучить, вы также можете сохранить цикл for с некоторым улучшением, поскольку функция mod может принимать более 1 делителя в качестве входных данных:

function A = modifikuj(A)
    [n,m] = size(A);
    for i = 1:n
       for j = 1:m
            k = A(i,j);
            if (k == 1)
                A(i,j) = 0.5;
            else
                if all(mod(k,2:k-1)) %check each modulo at the same time.
                    A(i,j)=1;
                else 
                    A(i,j)=0;
                end
            end
        end
    end

И вы все еще можете улучшить обнаружение простых чисел:

  • 2 - это единственное четное число для проверки.
  • число больше, чем A (i, j) / 2бесполезны

, поэтому вместо all(mod(k,2:k-1)) вы можете использовать all(mod(k,[2,3:2:k/2]))

Также обратите внимание, что функция isprime является гораздо более эффективным тестом простоты, поскольку она использует вероятностный Миллер-Rabin алгоритм.

0 голосов
/ 19 февраля 2019

В MATLAB вы обнаружите, что вы часто можете избегать петель, и есть множество встроенных функций, облегчающих ваш путь.Если это не упражнение по кодированию, где вы должны использовать предписанный метод, Я бы сделал следующий однострочный, чтобы получить желаемый результат :

D = isprime( A ) + 0.5*( A == 1 );

Это основано на двух простыхtests:

isprime( A ) % 1 if prime, 0 if not prime
A == 1       % 1 if == 1, 0 otherwise

Умножение 2-го теста на 0.5 дает желаемое условие для значения, равного 1, поскольку оно также вернет 0 для теста isprime.

0 голосов
/ 19 февраля 2019
  1. Вы ничего не возвращаете из функции.Возвращаемое значение должно быть 'B' в соответствии с вашим кодом, но это не установлено.Измените его на A.
  2. Вы продолжаете цикл k до A (i, j), который всегда делится сам по себе, переходите к A (i, j) -1

С помощьюкод ниже я получаю [0.5,1;1,0].

function A = modifikuj(A)
    [n,m] = size(A);
    for i = 1:n
       for j = 1:m
          prost=1;
            if (A(i,j) == 1)
                A(i,j) = 0.5;
            else
                for k = 2:(A(i,j)-1)
                    if(mod(A(i,j),k) == 0)
                        prost=0;
                    end
                end

                if(prost==1)
                    A(i,j)=1;
                else 
                    A(i,j)=0;
                end
            end
        end
    end
...