Matlab最快的矩阵列向量归一化方法

From 组长卢参义的博客:   http://blog.sciencenet.cn/blog-242887-496374.html


在使用matlab撰写代码时可能会遇到的一个问题就是矩阵列向量的归一化。在优化matlab代码方面,有一个较普遍适用的观点是尽可能地把数据向量化、矩阵化,因为matlab擅长矩阵运算。因此在一些matlab优化方面的教材中会看到一种向量化的矩阵列向量归一化方法,如下

vMag = sqrt(sum(X.^2));

X = X./vMag(ones(1,size(X,1)),:);

但事实上这种方法不仅耗内存而且又慢,目前我所知道的最快速的方法是

for i = 1 : num

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

end

这种方法相比于前一种方法在计算速度方面至少可以提升一倍。具体测试如下 

X = rand(5000,5000) ;

[dim,num] = size(X) ;

tic

for i = 1 : num

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

end

t1 = toc


tic

vMag = sqrt(sum(X.^2));

X = X./vMag(ones(1,size(X,1)),:);

t2= toc

返回结果:

t1 =

    0.5162

 

t2 =

    1.0806

 

如果把数据弄得更大,如

X = rand(10000,5000) ;

那么第一种方法内存都不足!返回结果如下,

 

t1 =

    0.9821

 

??? Out of memory. Type HELP MEMORY for your options.

Error in ==> Experiment_YaleB at 12

vMag = sqrt(sum(X.^2));


因此,不是所有的向量化操作都会提高运行效率,唯一的检验标准就是实践!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值