我正在向我的函数modifikuj
发送一个矩阵,我想在其中将矩阵的元素替换为:
我不明白为什么它不起作用。我刚开始使用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];
答案 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)
使用下面的代码,我得到[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
您仍然可以改善素数检测:
因此可以使用all(mod(k,2:k-1))
代替all(mod(k,[2,3:2:k/2]))
还要注意,函数isprime
是一种更有效的素数测试,因为它使用了概率Miller-Rabin算法。