原文地址: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