科学网 | 您所在的位置:网站首页 › matlab矩阵特征向量归一化 › 科学网 |
Matlab中矩阵列向量归一化的三种方法比较
已有 61722 次阅读 2014-4-16 21:01 |系统分类:科研笔记 矩阵列向量归一划在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 https://blog.sciencenet.cn/blog-86695-785606.html 上一篇:多目标进化算法QQ群~~ 收藏 IP: 219.220.215.*| 热度| |
CopyRight 2018-2019 实验室设备网 版权所有 |