- 积分
- 7095
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2018-11-26
- 最后登录
- 1970-1-1
![[稤野] 粉丝数:8 微博数:12 新浪微博达人勋](source/plugin/sina_login/img/light.png)
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我们经常看到网上说matlab擅长矩阵运算,如果能充分利用这一点减少循环语句的使用,程序运行效率提高将很明显,以下为一个个人使用的例子:
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次运算,这是对函数本身不熟悉造成的繁琐。
|
|