matlab 数组 归一化,科学网—Matlab中矩阵列向量归一化的三种方法比较 - 韩鼎的博文...

矩阵列向量归一划在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

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

由计算所得的时间结果绘图得到下图,观察图发现:在矩阵维数较低时,三种方法的计算时间差距不大,但

随着矩阵规模的增长,三种方法的计算时间也同时提高,但增长的幅度不同。方法三的计算时间最少,其次是方法二

和方法一。

fca410475611d488118ab94563445bb8.png

方法一采用矩阵点除的方法实现

方法二实际上为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.

37a306c27945a9b6ba3f9a812c0208a3.png

参考文献:转载本文请联系原作者获取授权,同时请注明本文来自韩鼎科学网博客。

链接地址:http://blog.sciencenet.cn/blog-86695-785606.html

上一篇:多目标进化算法QQ群~~

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值