如何编写没有循环的程序
How to write my program without loops
我正在尝试编写以下没有任何 for 或 while 循环的程序:
function [B] = check(A, k)
B = [];
[nrow ncol] = size(A);
for i = 1:nrow
for j = 1:ncol
if mod(A(i,j),k) == 0
B = [B;A(i,j)];
else
B = [B;A(i,j)*k];
end
end
end
基本上这个程序检查矩阵 A 中的元素是否可以被元素 k 整除。如果 A(i,j) 可被 k 整除,则 A(i,j) 处的元素将放入矩阵 B。如果 A(i,j) 不可被 k 整除,则 A(i,j) 处的元素j) 将乘以 k 并放入矩阵 B.
将A复制到B,然后将不能被k整除的元素乘以k:
A=[1 2;3,4];
k=2;
A1=A/k;
B=A;
B(A1-fix(A1)~=0)=B(A1-fix(A1)~=0)*k;
编辑:也没有使用额外的数组,类似于 eventHandler 的想法:
B=A;
B(mod(A,k)~=0)=B(mod(A,k)~=0)*k
我会这样做
auxA = mod(A,k);
B = A(auxA==0) + A(auxA~=0).*k;
auxA==0
生成与 auxA
大小相同的矩阵,其中 1's
位于条件为真的位置,其他位置为假。
A(auxA==0)
returns 矩阵 auxA==0
为 1 的 A(i,j)
的值,以及 auxA~=0
.
的 0
编辑。你可以在一行中完成此操作
B = A(mod(A,k)==0) + A(mod(A,k)~=0).*k;
但这会降低效率,因为您计算 mod(A,k)
两次。
另一种可能的解决方案:
B = A .* ((mod(A, k) ~= 0) * (k - 1) + 1);
由于您是逐行扫描,并且 B 被创建为列向量,因此您可以使用:
B = reshape((A .* ((mod(A, k) ~= 0) * (k - 1) + 1))', [], 1)
使用递归怎么样?效率低下?可能是。
function [A] = divvy(A, k, x, y)
[nrow ncol] = size(A);
if y < ncol
A = divvy(A, k, x, y+1)
elseif x < nrow
A = divvy(A, k, x+1, 1)
end
if mod(A(x,y),k) != 0
A(x,y) = A(x,y) * k
end
要使用它,只需传递 x=1 和 y=1。
我正在尝试编写以下没有任何 for 或 while 循环的程序:
function [B] = check(A, k)
B = [];
[nrow ncol] = size(A);
for i = 1:nrow
for j = 1:ncol
if mod(A(i,j),k) == 0
B = [B;A(i,j)];
else
B = [B;A(i,j)*k];
end
end
end
基本上这个程序检查矩阵 A 中的元素是否可以被元素 k 整除。如果 A(i,j) 可被 k 整除,则 A(i,j) 处的元素将放入矩阵 B。如果 A(i,j) 不可被 k 整除,则 A(i,j) 处的元素j) 将乘以 k 并放入矩阵 B.
将A复制到B,然后将不能被k整除的元素乘以k:
A=[1 2;3,4];
k=2;
A1=A/k;
B=A;
B(A1-fix(A1)~=0)=B(A1-fix(A1)~=0)*k;
编辑:也没有使用额外的数组,类似于 eventHandler 的想法:
B=A;
B(mod(A,k)~=0)=B(mod(A,k)~=0)*k
我会这样做
auxA = mod(A,k);
B = A(auxA==0) + A(auxA~=0).*k;
auxA==0
生成与 auxA
大小相同的矩阵,其中 1's
位于条件为真的位置,其他位置为假。
A(auxA==0)
returns 矩阵 auxA==0
为 1 的 A(i,j)
的值,以及 auxA~=0
.
编辑。你可以在一行中完成此操作
B = A(mod(A,k)==0) + A(mod(A,k)~=0).*k;
但这会降低效率,因为您计算 mod(A,k)
两次。
另一种可能的解决方案:
B = A .* ((mod(A, k) ~= 0) * (k - 1) + 1);
由于您是逐行扫描,并且 B 被创建为列向量,因此您可以使用:
B = reshape((A .* ((mod(A, k) ~= 0) * (k - 1) + 1))', [], 1)
使用递归怎么样?效率低下?可能是。
function [A] = divvy(A, k, x, y)
[nrow ncol] = size(A);
if y < ncol
A = divvy(A, k, x, y+1)
elseif x < nrow
A = divvy(A, k, x+1, 1)
end
if mod(A(x,y),k) != 0
A(x,y) = A(x,y) * k
end
要使用它,只需传递 x=1 和 y=1。