3D坐标中的RMSE(MATLAB)

时间:2013-09-09 10:20:42

标签: matlab 3d reshape

我有一个3D数据(气候变量),(x = 33,y = 35,z = 27)其中x,y表示网格点,z表示时间(yrs)。我需要在给定时间段内使用网格式RMSE。我要在计算RMSE之前屏蔽文件。掩码文件和数据的大小相同(包括时间)。没有。在掩蔽后,必须找到RMSE的网格减少(33 * 35 = 1155到357)。在重新整形原始数据后,我发现了这些减少的网格的RMSE。现在我有一个RMSE(357 * 1)的列矩阵,必须在2d中显示,即各个网格(33 * 35)。如何从1d较小的阵列重塑到2d更大的阵列?我的代码是:

IMD_load=load('IMD.mat'); % mask file cum observation data
IMD1=IMD_load.IMD_OBS;
IMD(:,:,:)=IMD1(:,:,1:27); % I'm doing only for 27 yrs of available time period

CFS_load=load('CFS.mat'); % model data
CFS1=CFS_load.CFSV2;
CFS2=CFS1(:,:,1:27); % I'm doing only for 27 yrs of available time period
CFS=CFS2-273.15;

for i = 1:1:27
  IMD2=IMD(:,:,i);
  IMD_1=reshape(IMD2,1155,1);
  IMD_1(isnan(IMD_1))=0;
  [IMD_m]=find(IMD_1==0);   

%  CFS3=CFS(:,:,i);
  CFS4=reshape(CFS(:,:,i),1155,1);
  CFS4(IMD_m,:)=0;
  CFS5=reshape(CFS4,1155,1);
  CFS6(:,i)=CFS5;
end

%我必须运行上面的for循环,因为每年都没有。 NaN的网格变化

OO1=reshape(IMD,1155,27);
MM1=reshape(CFS,1155,27);

OO2=reshape(OO1,1155*27,1); % is this corret?
MM2=reshape(MM1,1155*27,1); % is this corret?

[cfs6_m]=find(CFS6~=0);
[cfs6_m2]=find(CFS6==0);
OO3=reshape(OO2(cfs6_m,:),357,27); % (OR) OO4=reshape(OO2(cfs6_m),357,27);
MM3=reshape(MM2(cfs6_m,:),357,27); % (OR) MM4=reshape(MM2(cfs6_m),357,27);

for i = 1:1:357
  r2(i,:)=sqrt(sum((OO3(i,:)-MM3(i,:)).^2)/27);
end
% RR(1155,1)=reshape(R,33,35);

%我现在留下'r1'(357 * 1)。但是如何将其转换回33 * 35 ???

2 个答案:

答案 0 :(得分:0)

以下不起作用吗?

temp=reshape(R,33,35);
RR(1155,1)=temp;

答案 1 :(得分:0)

我的朋友向我推荐了使用三个for循环的传统方法。现在我的问题解决了。但您可能会建议更高效,更紧凑的代码。我的代码如下。如果您发现有问题,请告诉我。

IMD_load=load('IMD.mat');
IMD1=IMD_load.IMD_OBS;
IMD(:,:,:)=IMD1(:,:,1:27);

CFS_load=load('CFSV2.mat');
CFS1=CFS_load.CFSV2;
CFS2=CFS1(:,:,1:27);
CFS=CFS2-273.15;

for i = 1:1:27
  IMD2=IMD(:,:,i);
  IMD_1=reshape(IMD2,1155,1);
  IMD_1(isnan(IMD_1))=0;
  [IMD_m]=find(IMD_1==0);

%   CFS3=CFS(:,:,i);
  CFS4=reshape(CFS(:,:,i),1155,1);
  CFS4(IMD_m,:)=0;
  CFS5=reshape(CFS4,1155,1);
  CFS6(:,:,i)=reshape(CFS5,33,35);
end

rms(33,35,27)=0;
for i=1:1:27
  for j=1:1:35
    for k=1:1:33
        if (CFS6(k,j,i)~=0) || (IMD(k,j,i)~=0)
            rms(k,j,i)=((IMD(k,j,i)-CFS6(k,j,i)).^2);
        end
    end
  end
end

rms1(33,35)=0;
for i=1:1:27
  rms1(:,:)=rms(:,:,i)+rms1(:,:);
end

rms2=rms1/27;
TMAX_rmse=sqrt(rms2);