爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 12086|回复: 1

[程序设计] matlab循环操作矩阵化举例

[复制链接]

新浪微博达人勋

发表于 2020-11-14 11:26:55 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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次运算,这是对函数本身不熟悉造成的繁琐。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-10-27 21:28:05 来自手机 | 显示全部楼层
牛啊,不过很费脑子
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表