各位同学们好,
最近在学习matlab编程,但是在for循环这里出了问题,主要就是效率的问题,写好的一个for循环要运行2分钟30秒之久,于是想要改进程序希望能够运行速度更快一点,也差了一些资料。
提高for循环的效率的主要方法就是1提前给变量预村变量的空间,用ones 和zeros函数先定义变量的大小。2尽量避免用for循环,将其改成等价的向量形式。
对第一点比较简单,我也做了一些改善,对于第二点,我在实际的程序中遇到了一些问题,希望同学们可以帮到我,问题如下:
原有的for循环为:
for k=1:num.RI
bold6(1:k)=newalpha(1:k);
bold6(k)=0;
boldalpha=[newa,newb,bold6];
meanal=(Asquare(k)*bold3+newsigma0square)^(-1)*bold3*sum(A(:,k).*(y-newu-z*boldalpha'));
varal=(Asquare(k)*bold3+newsigma0square)^(-1)*newsigma0square*bold3;
newalpha(k)=sqrt(varal)*randn+meanal;
end
我修改后的for循环为:
bold6(1:(1:num.RI))=newalpha(1:(1:num.RI));
bold6(1:num.RI)=0;
boldalpha=[newa,newb,bold6];
meanal=(Asquare(1:num.RI).*bold3+newsigma0square).^(-1).*bold3.*sum(A(:,(1:num.RI)).*(y-newu-z*boldalpha'));
varal=(Asquare(1:num.RI).*bold3+newsigma0square).^(-1).*newsigma0square*bold3;
newalpha(1:num.RI)=sqrt(varal)*randn+meanal;
但是修改以后的循环出现了错误,错误为 the inner matrix do not agree.
错误出现在meanal=(Asquare(1:num.RI).*bold3+newsigma0square).^(-1).*bold3.*sum(A(:,(1:num.RI)).*(y-newu-z*boldalpha'));
而这一行与其他的区别主要是等式后缀有个sum(A(:,(1:num.RI)).*(y-newu-z*boldalpha')),其中A(:,(1:num.RI))为矩阵的1到num.Ri列后面(y-newu-z*boldalpha')为一个列向量,这就变成了矩阵与数组相乘再求和,但是matlab里面好像只有数组与数组相乘,我不知道这种情况应该怎么处理,希望知道的同学可以告诉我。
我的QQ为522036648,也希望知道这个问题的同学可以加我好友,方便交流学习,谢谢各位了!