如何编写没有循环的程序

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。