【问题标题】:RMSE in 3D coordinates (MATLAB)3D 坐标中的 RMSE (MATLAB)
【发布时间】:2013-09-09 10:20:42
【问题描述】:

我有一个 3D 数据(气候变量), (x=33,y=35,z=27) 其中 x,y 指的是网格点,z 是时间(以年为单位)。在给定的时间段内,我需要网格明智的 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 ???

【问题讨论】:

    标签: matlab 3d reshape


    【解决方案1】:

    以下方法不起作用吗?

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

    【讨论】:

    • 或者甚至只是RR = reshape(R,33,35)
    • 我之前试过:RR(1155,1)=reshape(r2,33,35); (我在问题的最后一行代码中评论过)但它说:“要重塑元素的数量不能改变。”
    • 不是RR(1155,1)=reshape(R,33,35),而只是RR=reshape(R,33,35);,即没有索引。据我所知,您尚未在代码中的任何位置定义 RR
    • 同样的错误......无论如何,我的朋友帮助我为每个维度设置了三个 for 循环。我认为它奏效了。感谢您的及时回复。
    【解决方案2】:

    我的朋友向我推荐了使用三个 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2014-09-15
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2015-08-14
      相关资源
      最近更新 更多