将三维向量改为二维,一个加速程序运行的方法

原函数

function [routeflow]=calculateX(X,route3D)
maxDay=130;
routeflow=sparse(zeros(118,maxDay));%路线/130天
for i = 1:21
    for j = 1:maxDay-20
        t=X(i,j).*reshape(route3D(i,:,:),[118,130]);
        if j>1
            t(:,j:j+11)= t(:,1:12);
            t(:,1:j-1)=0;
        end
        routeflow=routeflow+t;
    end
end

新函数

function [routeflow]=calculateX(X,route2D)
max=90;
routeflow=sparse(118,130);%路线/130天
for i = 1:21
	r=route2D(1+(i-1)*118:i*118,:);
    for j = 1:max
        t=X(i,j).*r
        if j>1
            t=circshift(t,j-1,2);
        end
        routeflow=routeflow+t;
    end
end

这段脚本要解决的问题是将21个118X130的矩阵与21X130个对应数据相乘,并将积移位后相加。

其中简化的点在于,

  1. 多个二维数据本来使用三维向量保存zeros(21,118,130),多余的一维代表不同的二维向量。 新代码则全部保存为二维向量zeros(21*118,130),使用行的截取来获取不同编号的的数据。
for i = 21
	2D(1+(i-1)*118:i*118,:)=cell{i}
end
  1. 矩阵的平移操作,原代码使用了较复杂的方法,新代码直接使用circshift解决,简洁而高效。
  2. 将内循环中的r=route2D(1+(i-1)118:i118,:);放入外循环,大大减少该条代码被调用的次数

结果:
原函数迭代十次花费2.407s或3s以上
新函数的1,2两点则为1.636s,加入第三个改进后,速度进一步减为0.889s

你可能感兴趣的:(MATLAB学习经验)