【问题标题】:How to write my program without loops如何编写没有循环的程序
【发布时间】:2015-08-06 08:26:45
【问题描述】:

我正在尝试编写没有任何 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 中。

【问题讨论】:

  • 这将是痛苦的,如果不是不可能的话。

标签: matlab function math for-loop while-loop


【解决方案1】:

将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

【讨论】:

    【解决方案2】:

    我会这样做

    auxA = mod(A,k);
    B = A(auxA==0) + A(auxA~=0).*k;
    

    auxA==0 生成一个与auxA 大小相同的矩阵,1's 在条件为真的位置,在其他位置为假。

    A(auxA==0) 返回A(i,j) 的值,其中矩阵auxA==0 为1,而矩阵auxA~=0 为0。

    编辑。您可以在一行中完成此操作

    B = A(mod(A,k)==0) + A(mod(A,k)~=0).*k;
    

    但这会降低效率,因为您计算了两次 mod(A,k)

    【讨论】:

      【解决方案3】:

      另一种可能的解决方案:

      B = A .* ((mod(A, k) ~= 0) * (k - 1) + 1);
      

      由于您正在逐行扫描,并且 B 被创建为列向量,因此您可以使用:

      B = reshape((A .* ((mod(A, k) ~= 0) * (k - 1) + 1))', [], 1)
      

      【讨论】:

      • 欢迎回来!好久没在这里见到你了!
      【解决方案4】:

      使用递归怎么样?低效?可能是。

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-17
        • 2019-02-02
        • 2021-07-31
        相关资源
        最近更新 更多