作者profyang (prof)
看板MATLAB
标题[心得] Matlab现在内建operator好强...
时间Mon Sep 18 22:29:50 2017
如果今天要做以下的事情
3
y=Σ (x^n) x=[1,2,3,4]
n=1
y希望出来也要是1*4的矩阵 对应上面的x
这类的问题原本的Matlab的话不用for loop最快的方法应该是
x=[1,2,3,4]; n=[1;2;3];
y = sum(bsxfun(@power,x,n),1);
这样出来是y=[3,14,39,84]
但是自从R2016b版本以後 Matlab内建的operator变超强
x.^n这种东西即使x和n的维度不一样也可以合法了
所以以下简洁的方法就可以取代上面的bsxfun:
x=[1,2,3,4]; n=[1;2;3];
y = sum(x.^n,1);
出来答案也是一样y=[3,14,39,84]
真的是不错
不过这样不小心维度写错结果也能跑的可能性增强了
有可能会debug半天 明明就可以跑但是结果是错的
最後发现维度搞错这样...orz
不过code真的可以简洁很多就是
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.194.197.139
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1505744994.A.3CF.html
1F:→ LiamIssac: .* .^都是的elementwise 很好用 09/18 22:44
2F:→ profyang: 对从小(?)习惯.*, .^运算子维度要一样的我很不习惯也颇 09/18 23:40
3F:→ profyang: 惊喜XD 09/18 23:40
4F:推 sunev: 对初学者而言,可能要更强调变数的size了 09/19 07:14
5F:推 sunev: 其实我还蛮希望增加 i+=1 及 i++ 等语法 09/19 08:20
i++有必要吗?
我觉得Matlab现在for loop的写法也颇方便的说
6F:推 linux5566: 如果data size 很大的话 这种用法效能会比 bsxfun 差 09/19 09:12
7F:→ linux5566: 自己的经验 09/19 09:12
求举例+1 我R2017a稍微试一下似乎没这种事
8F:推 sunev: 真的吗,这种事不应该发生才是,楼上可以给简单的例子吗? 09/19 13:42
※ 编辑: profyang (123.194.197.139), 09/19/2017 13:46:27
9F:推 linux5566: 我刚刚又测试过 应该是我误会了 抱歉 09/19 15:27
※ 编辑: profyang (123.194.197.139), 09/19/2017 19:08:16
10F:推 sunev: i++ 不止用在for loop啊,有时while loop也需要记录回圈次 09/20 15:19
11F:→ sunev: 数 09/20 15:19
对喔 大概是他们觉得i=i+1就够了吧XD
毕竟Matlab是尽量不要用回圈 尤其是不确定回圈数的情况 填矩阵会很慢
真要用就i=i+1就好
※ 编辑: profyang (123.194.197.139), 09/20/2017 20:37:12
12F:推 sunev: while loop也不一定是用来填矩阵,常用在递回收敛上,例如 09/20 20:51
13F:→ sunev: 用牛顿法求平方根。当然可以用i=i+1就好,但是理论上 09/20 20:52
14F:→ sunev: i++对compiler一定有好处,我只是希望matlab的jit compiler 09/20 20:52
15F:→ sunev: 也可以做到这点。 09/20 20:53
原来如此
※ 编辑: profyang (123.194.197.139), 09/20/2017 22:08:46
16F:推 callisto2: 正式名称叫 Implicit Expansion, data size 小的话 09/28 09:28
17F:→ callisto2: 会比 bsxfun 快, data size 大的话速度就没差别了. 09/28 09:30