通过省略不必要的循环来优化代码

时间:2018-01-13 14:50:10

标签: matlab

我想通过省略不必要的循环来优化一些例子,但我不知道如何。以下是示例:

mvn sonar:sonar

我试图用

来解决第一个问题
%Subtract 7 from all elements on the matrix diagonal
    A=rand(100,100)*10;
    for i=1:100
        A(i,i)=A(i,i)-7;
    end
---
%Count the number of elements of matrix A which are bigger than the adequate elements of matrix B
    A=rand(100,100)*10;
    B=rand(100,100)*10;
    a_bigger=0;
    for i=1:100
       for j=1:100
          if A(i,j)>B(i,j)
             a_bigger=a_bigger+1;
          end
       end
    end
---
    %Create vector with sums of 100 natural numbers (so-called cumulative ``sum):
B=[1, 1+2, 1+2+3... 1+2+3+...+n]
    A=1:100;
    B=zeros(1,100);
    for i=1:100
       for j=1:i
          B(i)=B(i)+A(j);
       end
    end

然而,它比现在更糟糕。它需要更多时间来运行代码。为什么是这样?有没有更快的方法来实现这个?

我正在查看矢量化页面,我尝试使用n=100; A=rand(n,n)*10; x=ones(1,n)*7; diag(x); A=A-x; 函数来解决第二个问题。但是当我写代码时

find
结果它给了我0。我做错了什么?

1 个答案:

答案 0 :(得分:0)

关于你的第一个问题:MATLAB在循环中的使用速度比现在慢很多。但是,如果将n增加到1e5或1e6,您可能会看到矢量化代码更有效。

最近的相关帖子:https://stackoverflow.com/a/48220174/7328782

而不是

x=ones(1,n)*7;

你可以做到

x=repmat(7,1,n);

防止n不必要的乘法。

关于您的第二个问题:findif的工作原理并非如此。但是你不需要使用:

I = A>B;

返回一个为true的逻辑矩阵(1)其中A更大。你想要计算那里的数量,你可以用两种方式来做:

a_bigger = sum(I(:));

a_bigger = sum(sum(I));

前者更快。它将矩阵重新整形为列向量,然后将所有元素相加。第二种形式将每列的所有元素相加,然后将所有总和相加。