| 
 
	积分7095贡献 精华在线时间 小时注册时间2018-11-26最后登录1970-1-1 
 | 
 
| 
我们经常看到网上说matlab擅长矩阵运算,如果能充分利用这一点减少循环语句的使用,程序运行效率提高将很明显,以下为一个个人使用的例子:
x
登录后查看更多精彩内容~您需要 登录 才可以下载或查看,没有帐号?立即注册 
  Corrs = cell(length(Indexes)*length(Vars), 3);
 for i = 1 : length(Indexes)
 index = eval(Indexes{i});
 index = interp1(find(~isnan(index)), index(~isnan(index)), 1:length(index), 'linear', 'extrap');
 for j = 1 : length(Vars)
 Corrs{(i-1)*length(Vars)+j, 1} = Indexes{i};
 Corrs{(i-1)*length(Vars)+j, 2} = Vars{j};
 
 var = eval(Vars{j});
 %% 方法1:循环语句(理解逻辑)
 %         Corr = nan(size(var, 1), size(var, 2));
 %         for m = 1 : size(var, 1)
 %             for n = 1 : size(var, 2)
 %                 var_mn = squeeze(var(m, n, :));
 %                 Corr(m, n) = corr(index', var_mn');
 %             end
 %             clear n var_mn
 %         end
 %         clear m
 %         Corrs{(i-1)*length(Vars)+j, 3} = Corr;
 %         clear Corr
 %% 方法2:循环操作矩阵化
 Var = reshape(permute(var, [3,1,2]), size(var,3), size(var,1)*size(var,2));
 Corrs{(i-1)*length(Vars)+j, 3} = reshape(corr(index', Var), size(var,1), size(var,2));
 clear m Var
 %%
 clear var
 Corrs{(i-1)*length(Vars)+j, 4} = nanstd(Corrs{(i-1)*length(Vars)+j, 3}(:));
 Corrs{(i-1)*length(Vars)+j, 5} = min(Corrs{(i-1)*length(Vars)+j, 3}(:));
 Corrs{(i-1)*length(Vars)+j, 6} = max(Corrs{(i-1)*length(Vars)+j, 3}(:));
 end
 clear j index
 end
 
 
 对比部分在方法1和方法2,循环操作矩阵化的核心在于顺应matlab对矩阵的计算顺序将原矩阵的顺序调整为和循环操作一致,这其中主要利用到reshape函数,要求对自己的数据有一定理解。
 另外,以corr函数为例,matlab本身定义了n*1数组和n*m数组可以做1*m次运算,得到1*m个结果,但很多新手会用循环依次做m次运算,这是对函数本身不熟悉造成的繁琐。
 
 | 
 |