矩陣按列歸一化(轉載http://blog.sciencenet.cn/blog-86695-785606.html)

     原文地址:http://blog.sciencenet.cn/blog-86695-785606.html


矩陣列向量歸一化在matlab編程時會經常遇到,例如振動理論中特徵向量,也就是振型的歸一化。本文列出了三種不同的實現方法,前兩種方法由博友給出(文獻1),這裏給出第三種方法,並且比較這三種方法的運行時間。


clear all;

clc;

result=[];

%---------------------------

for k=1:40

  num=100*k;

  X=rand(num);           %隨機矩陣

  A=X;   B=X;    C=X;    

%第一種方法------------------------

 tic

 leg=sqrt(sum(A.^2));

 A=A./leg(ones(1,num),:);

 t1=toc

%第二種方法-----------------------

 tic

 for i=1:num

 B(:,i)=B(:,i)/norm(B(:,i));

 end

 t2=toc

%第三種方法-----------------------

 tic

 leg=sqrt(sum(C.^2));

 C=bsxfun(@rdivide,C,leg);

 t3=toc

result=[result;k t1 t2 t3]; %記錄

end

%============================================


由計算所得的時間結果繪圖得到下圖,觀察圖發現:在矩陣維數較低時,三種方法的計算時間差距不大,但

隨着矩陣規模的增長,三種方法的計算時間也同時提高,但增長的幅度不同。方法三的計算時間最少,其次是方法二

和方法一。


方法一採用矩陣點除的方法實現

方法二實際上爲matlab內置的函數normc,每一列除以該列的模。

方法三用時最少主要因於bsxfun函數,該函數可謂是matlab中向量化編程的利器。



現在介紹一下bsxfun函數的用法:

假設A是m*n維的矩陣,B是1*n維的行向量,現在希望A的每一行都加上B,則可用下面語句


bsxfun(@plus,A,B)


實際上該語句等效爲


A+repmat(B,m,1)


即把B向量擴展爲與A兼容的m*n維矩陣,然後再與A相加。但在bsxfun中,這個擴展的操作是內部虛擬進行的,並不實際佔用內存,因此更快。


除了@plus,還有@time,@rdivide,等二元運算,具體用法參見文獻2.









參考文獻:

1. http://blog.sciencenet.cn/blog-242887-496374.html

2. http://blog.sina.com.cn/s/blog_9e67285801010ttn.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章