日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

三重for循环优化_MATALB中对循环操作的优化

發布時間:2025/4/16 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三重for循环优化_MATALB中对循环操作的优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知,MATLAB程序效率最低最有潛力的地方便是循環了。最常見的循環莫過于對矩陣中的每一個元素進行操作,對于編程思維還在C語言或者C++,JAVA的人來說,第一反應就是兩層循環,先來個 “for i=1:m”對矩陣的行進行循環,再來個“for j=1:n”對矩陣的列進行循環。所以我前面就直接寫出了一個四重for循環,被自己蠢哭了!程序時間長到壓根沒法等。其實自己知道這四重循環是可以優化的,但一直沒專門研究過MATLAB循環優化的問題,既然碰到了,也就專門考慮了下這個問題。下面有兩種對于矩陣元素操作for循環的優化方法。

? ? ? ? ? ?一,采用meshgrid函數。

? ? ? 大家都知道采用向量化或者矩陣化運算來代替循環是MATLAB里最好的最有效率的優化方法。這里對于2*3大小的矩陣A的元素進行操作,就可以采用meshgrid函數對for循環進行矩陣化替代。對于

i=1:2;

j=1:3;

可以替代為

[m,n]=meshgrid(i , j);
m=[ 1 1 1
2 2 2 ]

n=[1 2 3
1 2 3 ]

可以看到這里,生成的矩陣m和n的規模大小是相等的,都是2*3 。

A(m(1,1),n(1,1))=A(1,1) ?A(m(2,2),n(2,2))=A(2,2)

A(m(2,1),n(2,1))=A(2,1) ??A(m(2,3),n(2,3))=A(2,3) ?

? ? 大家發現規律沒,m,n其實就是矩陣A的下角標行和列的索引。例如:求函數f(x,y)=x^2+y^3,x=1:256,y=257:512,

優化后的代碼:

x=1:256;

y=257:512;

[m,n]=meshgrid(x,y);

f=m.^2+n.^3;

完全沒有用到for循環,采用矩陣化運算,速度大幅度提高。

? ? 二,通過求余優化

? ? ? ? 在電腦內存里,矩陣作為二維向量,其實也是當成一維矩陣存放的。假設A為3*4的矩陣,即A(2,3)=A(7)。所以,也可以把二維矩陣當成一位向量來看。我們可以把一維矩陣A(k)通過求余的方法得到這個元素才二維矩陣里對應的行i和列j。

? ? ? ?同樣采用A(2,3)=A(7)的例子,(7-1)/4+1,再向下取整得到2,(7-1)mod(4)+1=3 ,從而得到了A(7)元素在二維矩陣中對應的下標位置(2,3)。

例如,對于大小為m*n的矩陣A,計算B(i,j)=A(i,j)+i+j后的矩陣B,具體程序實現:

for k=1:m*n

? ? ?row=floor(k-1,n)+1;

? ? ?col=mod(k-1,n)+1;

? ? ?B(k)=A(k)+row+col;

end

? ? ?這樣就把兩層for循環優化成了一層,雖然計算量并沒有減少多少,但可以這樣可以開MATLAB的并行運算了,照樣可以大幅度提高運算速度,因為parfor是不支持兩層兩層以上的循環的,所以這種優化是有意義的。并且在適合的情況下,也可以進一步把for k=1:m*n循環改成向量化運算k=1:m*n,一層循環都不用。

總結:

1)用矢量運算代替循環,可以極大提升運算效率

2)在不可避免使用多重循環過程中,內外循環次數的設置和列優先是存在一個平衡點的。當內外循環次數相差較大,用內重外輕的設計方案可以有效地提升程序的運行效率,而此時的列訪問的優勢正在失去;當內外循環次數相差不大時,此時列訪問的運算效率上的提升更加明顯!

總結

以上是生活随笔為你收集整理的三重for循环优化_MATALB中对循环操作的优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。