matlab ema 向量化,MatLab向量化编程arrayfun函数的使用

我们知道,MATLAB编程核心思想之一就是向量化。MATLAB的很多built-in函数,向sin,cos,find等等都支持向量运算。但是,很多时候我们编写的函数的输入变量是标量,而我们又要对很多组参数进行函数调用,MATLAB7以前的版本中我们只能通过循环来实现,如果参数的维数增加,就会出现循环套循环的现象,效率恐怖。从MATLAB7.1开始,MATLAB新增arrayfun这个built-in函数来实现将任意函数应用到数组内包括结构在内的所有元素。这样很多以前不可避免的循环现在可以向量化了。举例如下:

例1:生成一个这样的n*n矩阵a:a(i,j)=dblquad(@(u,v)

sin(u)*sqrt(v),0,i,0,j)。以n=10为例,

以前我们可能这样做:

CODE:

a=zeros(10);

for ii=1:10

for jj=1:10

a(ii,jj)=dblquad(@(u,v) sin(u)*sqrt(v),0,ii,0,jj);

end

end

现在我们只需这样:

CODE:

[J,I]=meshgrid(1:10);

a1=arrayfun(@(ii,jj) dblquad(@(u,v)

sin(u)*sqrt(v),0,ii,0,jj),I,J);

例2:验证角谷猜想,一个正整数n,如果是偶数除以2,如果是奇数乘以3加1,得到的新数继续按上述规则运算,最后结果都为1。验证1到100000内的正整数。

先编写单个数的验证函数

CODE:

function f=jiaogu(n)

while(n>1)

if (mod(n,2)==1)

n=n*3+1;

elseif(mod(n,2)==0)

n=n/2;

else break;

end

end

f=n;

验证1:100000, 以前我们可能这样做:

[Copy to clipboard] [ - ]

CODE:

a=zeros(1,100000);

for k=1:100000

a(k)=jiaogu(k);

end

all(a)

现在我们只需这样:

[Copy to clipboard] [ - ]

CODE:

all(arrayfun(@jiaogu,1:100000))

举这两个例子目的是为了让大家知道很多以前不能优化的程序利用这个函数还可以进一步优化。具体了解请doc arrayfun

。另外cellfun和structfun也提供了类似的功能,关于其用法,帮助文档里写的很详细。

例3:有一组数据2800行24列,我想每隔22行取7行用matlab怎么做啊?如果想把取得的每7行取平均该怎么办呢?

CODE:

data=rand(2800,24);

Dat1=data(mod(1:2800,29)==0 |

mod(1:2800,29)>=23,:);

cellfun(@mean,arrayfun(@(k)

Dat1(7*k-6:k*7,:),1:round(624/7),'UniformOutput',false),'UniformOutput'

,false)

你可能感兴趣的:(matlab,ema,向量化)