根据矩阵元素是素数,1还是都不输出,输出1、0.5或0

时间:2019-02-19 12:19:39

标签: matlab for-loop primes

我正在向我的函数modifikuj发送一个矩阵,我想在其中将矩阵的元素替换为:

  • 如果element是质数则为1
  • 如果element是一个复合数字,则为0
  • 如果元素为1,则为0.5

我不明白为什么它不起作用。我刚开始使用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 :(得分:2)

在MATLAB中,您常常可以避免循环,并且有很多内置函数可以简化您的路径。除非您必须使用规定的方法进行编码练习,否则我将通过以下一种方法来获得所需的结果

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

这依赖于两个简单的测试:

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

将第二个测试乘以0.5会为您在值1时提供所需的条件,因为它也会为0测试返回isprime

答案 1 :(得分:1)

  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

答案 2 :(得分:1)

除了@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

我已经假设矩阵只包含整数。

如果您只想学习,由于功能mod可以接受多个除数作为输入,因此您还可以保留for循环并进行一些改进:

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是一种更有效的素数测试,因为它使用了概率Miller-Rabin算法。