matlab矩阵作分钟平均,提高matlab运行速度和节省空间的心得合集(ZT)

B =

aiTemp(A(iXmin:iXMax,iYMin:iYMax,iZMin:iZMax));

当然了,改进的前提是知道矩阵A的非零元(即值为true的元素)大致的分布,也就是能够求出iXmin:iXMax,iYMin:iYMax,iZMin:iZMax这个范围。现在终于明白并体会到cwit所说的“连num2str都优化过”的含义了。

3.

不断优化代码,例如corrcoef函数,matlab自带的corrcoef函数求整个矩阵所有列的相关系数,因为我只需要求出某一列跟其他各列的相关系数,所以参照corrcoef函数自己写了一个,不但把速度提了上去,而且还发现了:repmat(5,100,1)的速度并不比ones(100,1)*5

快,另外,别小看一个小矩阵的转置操作,当循环次数很大的时候,有没有转置就相差很远了。

4. 使用逻辑运算符&、| 时,两个操作对象最好是logical类型,否则速度会减慢。

5.

二维矩阵转置操作可以用以下三种方法进行,三者的效率基本一样(时空),如果遇到三维以上的矩阵要转置,用permute命令较为方便:

a) A = A’;

b) A = permute(A,[2,1]);

c) A = shiftdim(A,1);

6. “使用eval方式动态存储多个一维数组”比“使用二维数组动态存储多个一维数组”要快,即:eval_r(['A_',

num2str(k),' = B;']);比 A(k,:) = B;

快,其中B是一个一维数组,k表示循环次数。注:并非所有B都进行存储,只存储满足某个条件的B,另外,对预申请空间A不成功,这是对结论的补充说明。值得注意的是,如果对B是一个稀疏的一维数组,则eval方式的优势荡然无存,当k增大时反而增加系统开销。

7.

当矩阵很大时,利用A(:,k+1:end)=[];去掉多余元素操作时会减慢程序的运行,因此,如果后续处理中没有用到这些多余元素,则没有必要使用这个语句,即不管就是了。

8.

当需要对很大的一个矩阵进行操作时,可以考虑使用循环来完成。例如corrcoef函数,如果处理的对象矩阵A是100*180时(即对100个列向量求它们两两之间的相关程度,假设需要的只是前面99个与第100个向量的相关系数,其他不需要用到),直接用corrcoef(A)会比较慢,这时候可以考虑把矩阵A分为5个部分,每个子块与第100个向量进行相关,这样速度会更快。

9.

局部比较、赋值比全局比较、赋值要快(呵呵,这是废话),假设A、B都是三维逻辑矩阵,如果只想对某个局部(例如X_1:X_2,Y_1:Y_2,Z_1:Z_2这个立方体)进行比较和赋值,则推荐使用B(X_1:X_2,Y_1:Y_2,Z_1:Z_2)

= B(X_1:X_2,Y_1:Y_2,Z_1:Z_2) &

~A(X_1:X_2,Y_1:Y_2,Z_1:Z_2),这比B(A) = false或B =

B&~A速度上都要快不少。

后记:

1.

此心得原来打算在cwit给了我回复,指正文中错误之后再整理并发布的,不过cwit很忙,所以不知道要等到什么时候,因此先献丑了,有错误大家也帮忙指正一下。(注:这个版本删除了“循环总次数固定无论使用多少个for循环速度不变”这句,因为考虑到矩阵维数会影响速度)

2. 上述技巧都是出自我在处理大型矩阵时候自己总结出来的个人心得,转载时请注明。

3.

实验室中由于只有我一个人比较关心matlab的运行速度和存储空间问题(尤其是速度问题),所以不像cwit那样,有一个团队可以互相讨论互相提高,因此,我的心得难免有错误或理解不当的地方,请大家见谅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值