用Matlab一次性计算不同栅格数据之间相关系数(逐月)

这里计算相关系数的代码是参考了这个文章:不同栅格数据之间的相关系数计算(输出为tif影像)_栅格数据相关系数-优快云博客

因为我需要计算的是a变量跟每个月温度和降水量之间的相关性,如果你每跑完一个月手动改一次代码就很麻烦,所以我就稍微扩展了一下,供大家参考,本人比较菜,用的方法也很机械,但保证好用!

clc;
clear;
tic;我习惯加上这个计时器,可以直观感受到代码效率

[a,R]=geotiffread("F:\paper1_data\paper1\snow_pheno\SCD\SCD_2002_modified.tif"); % 导入投影信息,放自己要分析的数据路径即可
info=geotiffinfo("F:\paper1_data\paper1\snow_pheno\SCD\SCD_2002_modified.tif"); % 同上
[m,n]=size(a);
for months=1:12 %一月到十二月
    month_code=sprintf('%02d',months);
    SCDsum=single(zeros(m*n,21)); % 我这里使用了single类型,因为后面要并行运算,可以缓解内存使用量
    for year=2002:2022 %年份开始和结束时间
        filename=strcat('F:\paper1_data\paper1\snow_pheno\SCD\','SCD_',int2str(year),'_modified.tif'); % 此处需要按你文件名修改
        data=importdata(filename);
        data=single(reshape(data,m*n,1)); 
        SCDsum(:,year-2001)=data; % 此处需要修改,从哪一年开始,你就减1,我的是2002年开始,所以写了2001
    end
    
    tmpsum=single(zeros(m*n,21)); % 温度
    for year=2002:2022
        file_tmp=strcat('F:\paper1_data\paper1\aux_data\0222_500m\temp_500_ca\',int2str(year),'\',int2str(year),month_code,'_temp.tif'); % 此处要修改,每个人存数据的习惯不一样,我这里是每年一个文件夹,里面是那年逐月的数据,例.....\2002\200201_temp.tif
        disp(file_tmp) %为了检查运行的对不对,一般前两个循环没问题整体就不会有问题
        data=importdata(file_tmp);
        data=single(reshape(data,m*n,1));
        tmpsum(:,year-2001)=data;
    end
    
    presum=single(zeros(m*n,21)); % 降水量
    for year=2002:2022
        file_pre=strcat('F:\paper1_data\paper1\aux_data\0222_500m\pre_500_ca\',int2str(year),month_code,'_pr.tif'); % 此处要修改,有些人习惯这样存数据,直接把整个数据都放在一个文件夹里,例.....pre_500_ca\200201_pr.tif
        disp(file_pre)
        data=importdata(file_pre);
        data=single(reshape(data,m*n,1)); 
        presum(:,year-2001)=data;
    end
    
    % 相关性和显著性
    SCD_tmp_xgx=single(zeros(m,n)); % a与温度的相关系数(a是你的数据名)
    SCD_tmp_p=single(zeros(m,n));   % 温度p值
    SCD_pre_xgx=single(zeros(m,n)); % 降水量相关系数
    SCD_pre_p=single(zeros(m,n));   % 降水量 p 值
    
    parfor i=1:length(SCDsum) %这里用的并行处理,如果爆内存了,就用for
        SCD=SCDsum(i,:); 
        if min(SCD)>0 % 如果你的数据都大于0,可以放;如果存在负值,把这if语句删了即可
            tmp=tmpsum(i,:);
            [r2,p2]=corrcoef(SCD,tmp);
            SCD_tmp_xgx(i)=single(r2(2));  
            SCD_tmp_p(i)=single(p2(2));    
        end
    end
    
    filename1=sprintf('F:\\paper1_data\\paper1\\corr_pheno_metro\\month\\SCD\\corr_SCD_tmp%s.tif', month_code); %输出的文件路径,例corr_SCD_tmp01.tif
    filename2=sprintf('F:\\paper1_data\\paper1\\corr_pheno_metro\\month\\SCD\\p_SCD_tmp%s.tif', month_code); %同上
    
    %% 输出图像
    geotiffwrite(filename1,SCD_tmp_xgx,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
    geotiffwrite(filename2,SCD_tmp_p,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
    
    parfor i=1:length(SCDsum) %如果你只分析一个变量,从这里开始删到我注释的地方即可
        SCD=SCDsum(i,:);
        if min(SCD)>0 
            pre=presum(i,:);
            [r2,p2]=corrcoef(SCD,pre);
            SCD_pre_xgx(i)=single(r2(2));  
            SCD_pre_p(i)=single(p2(2));    
        end
    end
    
    filename3=sprintf('F:\\paper1_data\\paper1\\corr_pheno_metro\\month\\SCD\\corr_SCD_pre%s.tif', month_code);
    filename4=sprintf('F:\\paper1_data\\paper1\\corr_pheno_metro\\month\\SCD\\p_SCD_pre%s.tif', month_code);
    
    %% 输出图像
    geotiffwrite(filename3,SCD_pre_xgx,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
    geotiffwrite(filename4,SCD_pre_p,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag); % 删到这里~~~~~~~~~~
    fprintf('%d is done!\n', months);
    clearvars -except elapsed_time R info months m n; %缓解内存压力,留下我们需要的变量
end
elapsed_time = toc;
fprintf('Elapsed time: %.2f seconds\n', elapsed_time);

用的时候遇到什么样的问题,可以评论或者私我,我上优快云比较佛系,如果看到了就必定回复!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值