MATLAB for循環優化三例


  最近一周,對MATLAB有進行了新一輪的學習,對其矩陣化編程的思維有了更深入的了解。確實精妙!

例1:

  將矩陣A= [1 2 3; 2 4 3; 3 4 5]中所有的數字3替換為33.

如果還停留在C語言的思維可能就是

>> for i=1:3
for j=1:3
if A(i,j)==3
A(i,j) = 33;
end
end
end
>> A
A =
     1     2    33
     2     4    33
    33     4     5

  而MATLAB語言則有更靈活的語法,

>> A(A==3) = 33
A =
     1     2    33
     2     4    33
    33     4     5

  這句的意思就是講matlab中等於3的數復制為33;

>> A==3
ans =
     0     0     1
     0     0     1
     1     0     0

  當在MATLAB中輸入A==3

>> A==3
ans =
     0     0     1
     0     0     1
     1     0     0

  得到的是一個邏輯數組,接下來的復制操作只對邏輯為真的部分進行。顯然后一種寫法代碼更加簡潔。

例2

將A= [1 2;2 3; 3 4; 4 5]每行視為坐標;將5階零矩陣的這四個位置復制為1;

  繼續常規思維,也是最正常的思維就是每個位置賦值:

>> A= [1 2;2 3; 3 4; 4 5];
B = zeros(5);
for i=1:4
    B(A(i,1),A(i,2)) = 1;
end
>> B
B =
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1
     0     0     0     0     0

  這里可以使用sub2ind這個函數,從字面意思已經知道,是將下標轉換為索引值,具體原理可以help sub2ind以及type sub2ind(查看源碼)

所以可以直接寫成

>> A= [1 2;2 3; 3 4; 4 5];
>> B = zeros(5);
>> B(sub2ind(size(B), A(:,1), A(:,2)))=1
B =
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1
     0     0     0     0     0

  深刻體會到矩陣處理問題的簡潔之美!

例3

統計矩陣A = [1 3 4; 5 3 2; 4 2 1]中3的個數

如果還停在初學C語言的思維,恐怕又是靠for解決問題

>> A = [1 3 4; 5 3 2; 4 2 1];
>> a = 0;
>> for i=1:3
for j=1:3
if A(i,j)==3
a = a+1;
end
end
end
>> a
a =
     2

  這使如果知道find函數和length函數,就會輕松不少:

>> length(find(A==3))
ans =
     2

 總結,通過以上三個例子,可以看到:

  1、學習一門新的東西,一定要把握其精髓,不要固定步自封(比如一味使用for循環)、生搬硬套;

  2、就我現在體會,學習matlab最重要的是學習它豐富的函數和靈活的語法,也就是說這門語言處理運算的思維。

  3、作為一個技術人員,一定要偷懶,摳門。什么是偷懶,相同的功能,能用一行代碼解決絕不用兩行,什么是摳門,用最簡潔的思維,最快的時間、最小的內存。

  4、敢想敢做,敢想:為什么不能用一行代碼解決;敢做,敢於通過學習實現自己的想法。

2015-12-13


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM