我想通过省略不必要的循环来优化一些例子,但我不知道如何。以下是示例:
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。我做错了什么?
答案 0 :(得分:0)
关于你的第一个问题:MATLAB在循环中的使用速度比现在慢很多。但是,如果将n
增加到1e5或1e6,您可能会看到矢量化代码更有效。
最近的相关帖子:https://stackoverflow.com/a/48220174/7328782
而不是
x=ones(1,n)*7;
你可以做到
x=repmat(7,1,n);
防止n
不必要的乘法。
关于您的第二个问题:find
或if
的工作原理并非如此。但是你不需要使用:
I = A>B;
返回一个为true的逻辑矩阵(1)其中A更大。你想要计算那里的数量,你可以用两种方式来做:
a_bigger = sum(I(:));
或
a_bigger = sum(sum(I));
前者更快。它将矩阵重新整形为列向量,然后将所有元素相加。第二种形式将每列的所有元素相加,然后将所有总和相加。