爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 20491|回复: 21

[程序设计] matlab初学

[复制链接]

新浪微博达人勋

发表于 2015-12-22 17:08:22 | 显示全部楼层 |阅读模式
1金钱
给各位大虾,本人初学,实在搞不明白了,前来求教。
想求一个变量u的纬向偏差值。
将四维数据先求得了纬向平均变成三维,然后就卡住了。
用四层循环变成四维数组,求得的纬向偏差是错的,第二维数据全为零。
所以我该怎么设置循环呢?求教,新手百度多日了,已跪,望指教

clc;clear all;

uu=ncread('F:/ERAdata/allwinter.nc','u');
zz=ncread('F:/ERAdata/allwinter.nc','level');
zz=zz(1:11);
lat=ncread('F:/ERAdata/allwinter.nc','latitude');
lat=double(lat);
lat=lat(1:37);
lon=ncread('F:/ERAdata/allwinter.nc','longitude');
lon=lon(1:144);
utq=uu(:,:,1:11,3:110);

upj(1:37,1:11,1:108)=0.0;
for sj=1:108
    for gd=1:11
        for wd=1:37
            for jd=1,144;
                upj(wd,gd,sj)=upj(wd,gd,sj)+utq(jd,wd,gd,sj);
            end
            upj(wd,gd,sj)=upj(wd,gd,sj)/(jd);
        end
    end
end

upjj(1:144,1:37,1:11,1:108)=0.0;
  for sj=1,108;
      for gd=1:11
          for wd=1:37
              for jd=1:144
                upjj(jd,wd,gd,sj)=upj(wd,gd,sj)+upjj(jd,wd,gd,sj);
              end
           
          end
      end
  end

up(1:144,1:37,1:11,1:108)=0.0;
  for sj=1,108;
      for gd=1:11
          for wd=1:37
              for jd=1:144
                up(jd,wd,gd,sj)=utq(jd,wd,gd,sj)-upjj(jd,wd,gd,sj);
              end
          end
      end
  end
   

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-22 21:16:29 | 显示全部楼层
楼主初学matlab,感觉还留着很深的fortran烙印。首先我想说这个软件之所以叫matlab(矩阵实验室),是因为它对矩阵或者数组有着很好地运算能力。所以楼至一定要摒弃一个思想——循环。
言归正传,说说你想要求的纬偏场
拿u风场来说:假设,你的u的四维分别是(lon,lat,lev,time),大小为(m,n,z,t)
首先需要求纬向平均场,很简单 uave = squeeze(nanmean(u,1));
nanmean(u,1),表示对u这个四维数组的第一维求平均,即纬向平均,squeeze表示矩阵缩小维度,uave就变成了(lat,lev,time)这样一个三维数组
纬偏场是原始值减去纬向平均值,uano = u-repmat(uave,n,1,1,1);
repmat表示矩阵重排,由于纬向平均场一个纬度仅有一个值(该纬圈平均值),repmat(ave,n,1,1,1)表示把uave重新排列成与u同样大小的四维数组,这样,u-repmat(uave,n,1,1,1)就直接得到了u风场的纬偏场。
这就是matlab的方便之处,你甚至可以将其改写成一行即可求得结果:uano = u-repmat(squeeze(nanmean(u,1)),n,1,1,1);
希望楼主多多学习matlab,灵活运用,会给你带来很多的方便。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-12-22 21:20:02 | 显示全部楼层
上述有一处错误,repmat(uave,n,1,1,1)这句中,应该吧n改成m,因为lon对应的大小是m
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2015-12-22 22:13:34 | 显示全部楼层
泰达巴神 发表于 2015-12-22 21:16
楼主初学matlab,感觉还留着很深的fortran烙印。首先我想说这个软件之所以叫matlab(矩阵实验室),是因为 ...

十分感谢,看来有好的有用的函数还需要学习了,多谢{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2015-12-23 08:44:33 | 显示全部楼层
泰达巴神 发表于 2015-12-22 21:20
上述有一处错误,repmat(uave,n,1,1,1)这句中,应该吧n改成m,因为lon对应的大小是m

答主你好,我按照你的方法运行了repmat函数,报错为Error using repmat Too many input arguments.于是我就改成了repmat(uave,m,1,1),还是报错,改成repmat(uave,m,1)生成了一个(m*n,lev,time)3维的数组,所以这个函数可以这么用来扩展维数吗?help里的解释也是没看懂啊
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-12-23 09:02:42 | 显示全部楼层
学习{:5_213:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-12-23 09:10:07 | 显示全部楼层
这是初学者的水平吗?
不要打击我学matlab的信心
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-12-23 10:48:29 | 显示全部楼层
昨天发贴的时候只是凭空想像的,所以忽略了一些问题。
uave = squeeze(nanmean(u,1)); 应该把这一步中的squeeze()这一部分去掉,让矩阵还保持四维。
接着再做uano = repmat(uave,m,1,1,1); 就可以了~~
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2015-12-23 18:41:25 | 显示全部楼层
泰达巴神 发表于 2015-12-23 10:48
昨天发贴的时候只是凭空想像的,所以忽略了一些问题。
uave = squeeze(nanmean(u,1)); 应该把这一步中的sq ...

十分感谢,我再去试一下
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2015-12-23 19:38:42 | 显示全部楼层
泰达巴神 发表于 2015-12-23 10:48
昨天发贴的时候只是凭空想像的,所以忽略了一些问题。
uave = squeeze(nanmean(u,1)); 应该把这一步中的sq ...

严重怀疑自己学历了,按答主说的,用uave = nanmean(utq,1);得到了四维纬向平均。然后用a=repmat(uave,144,1,1,1);又报错。醉了。查了用法
B=repmat( [1 2;3 4],2,3)
B =

1      2      1     2    1    2

3      4      3     4    3    4

1     2     1     2     1     2

3     4     3     4     3     4


其结果变为4X6。
所以不理解为什么报错。
a=utq-repmat(uave,144,1);没有报错,生成了四维u',但其实不对吧
b=a(:,:,1,1)'
area(b,'DisplayName','b')
contourf(b)
测试了一张图
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

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

本版积分规则

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

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

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