|
[hide](1)
%==============n列的矩阵按第一行升序排序=====================
a=[5,8,3,2,9,7,4;7,8,9,5,2,3,6]'; %两列的矩阵
[e,id]=sort(a(:,1)); %对矩阵a进行升序排列,返回到e上;id指出a中元素在e中位置
[m,n]=size(a);
%aSorted=e;
for i=2:n
f=a(:,i); %a的第n列赋值给f
%aSorted=[aSorted,f(id)];
e=[e,f(id)];
end
%=======================================================================
(2)
A=[time' pres' temp'];
%*********************去掉矩阵中重复的行************************
b = [0 0 0]; c = [0]; d = [0]; e = [0]; f = [0]; g = [0 0 0]; gg = [0 0 0];
[b c d]= unique(A,'rows'); %b返回矩阵A中唯一的行;c体现b在A中的位置;d是A在b的位置;
[e f]= sort(c); %对矩阵c进行升序排列,返回到e上;f即index,只出e中元素在c中位置
[col row] = size(b); %获得矩阵b的行、列数
g = repmat(0,col,row); %复制、堆叠数组
g(f,:) = b;
%***************************************************************
(3)
%==========删除矩阵中第二列小于0的行===================================
num=randn(8,5);
num_del=find(num(:,2)<=0);
b=num;
b(num_del,:)=[];
b %对比一下num和b的区别
%===============================================
(4)
%==========双Y轴===================================
x=0:900;a=1000;b=0.005;
y1=2*x;
y2=cos(b*x);
[haxes,hline1,hline2]=plotyy(x,y1,x,y2,'semilogy','plot');
axes(haxes(1))
ylabel('semilog plot');
axes(haxes(2))
ylabel('linear plot');
(5)
%==========
曲线拟合工具箱cftool=================================
参考 curve fitting
该命令给出了一维数据拟合的交互式环境,具体执行步骤如下: 《Simulink与信号处理》
(1)把数据导入到工作空间;
(2)运行cftool,打开用户图形界面窗口;
(3)对数据进行预处理;
(4)选择适当的模型进行拟合;
(5)生成一些相关的统计量,并进行预测。调用形式:
cftool
cftool(xdata,ydata)
cftool(xdata,ydata,w)
例如输入:
cftool(Year,ZTD)
利用fourier(傅里叶级数)这种方式来拟合的效果
拟合的数据保存到工作空间——
a.点击主界面上的analysis按钮
b.在Analyze at Xi项目中将拟合后数据对的Xi的value换成和原先离散数据相同的x轴数据
c.在Evaluate fit at Xi项目上打勾,点击apply
这就是拟合后的数据对。
(6)
% ===================读取文件内容===========================
[filename,filepath]=uigetfile('*.txt','选择文件!!!!');
file = [filepath filename];
fid = fopen(file,'rt');
if fid == -1
error('文件打开错误。')
end
%% 2 提取
mynumber = [];
while 1
nextline = fgetl(fid);
if ~isstr(nextline), break, end
disp(nextline);
a = sscanf(nextline, '%f');
mynumber = [mynumber;a]
end
numplot=mynumber(:);
plot(numplot);
%===================按行读取文件内容==============================
fidin=fopen(listname,'r');
%
i=0;
while ~feof(fidin)
i=i+1;
line = fgetl(fidin);
……
end
(7)
===============剔除奇异值(粗差剔除)======2012-03-13===========================
%求得一组数的均值和标准差,这组数与均值的差值如果超过标准差的3倍(具体自己可以定义),就认为是异常数据!
n=length(Tm_r);
for i=1:n
if abs(Tm_r(i)-mean(Tm_r)) > 3*std(Tm_r)
Tm_r(i)=0;
end
end
all=[Dyear Tm_r Tm_b]; %然后用上面的代码(3)即可剔除
(8)
===============X和Y轴的平行线======2012-04-09===========================
%效果图略
xa=3;ya=0:0.01:100;
xb=2:0.001:4;
yb=0*xb+20;
figure
plot(xa,ya)
hold on
plot(xb,yb,'-r')
(9)
满足条件(1)的情况下,做出(2)的处理。
if 条件1
……
while 1
……
break
end
end
=====利用while1 ... break 组合在海量数据中读取坐标和后几行的时间(这个不好描述,恐怕只有浩瀚本人才知道啥意思:)2012-04-25======
r=0;
while ~feof(fidin)
line = fgetl(fidin);
if (line(1:10)==['Loc. SHAO']);
r=r+1;north(r)=str2double(line(40:60));
while 1
line = fgetl(fidin);
if (line(1:8)=='Eph. #IC')
year(r)=str2double(line(10:11));
day(r)=str2double(line(13:15));
break; %只有出现坐标了,才读Eph标识的时间,然后马上跳出(中断)这次while 1循环。
end
end
end
end
(10)
将NaN转为数字或删除
在做统计时,常需要将NaN转化为可计算的数字或去掉,以下是几种方法:
注:判断一个值是否为NaN,只能用 isnan(),而不可用 x==NaN;
% 1
i = find( ~ isnan(x));
x = x(i) 先找出值不是NaN的项的下标,将这些元素保留
% 2
x = x(find( ~ isnan(x))) 同上,去掉NaN
% 3
x = x( ~ isnan(x)); 更快的做法
% 4
x(isnan(x)) = []; 消掉NaN
% 5
X(any(isnan(X)’),:) = []; 把含有NaN的行都去掉
例:data是1000*3的矩阵,去掉data中的NaN,则:
>> data1=data;
>> data1(any(isnan(data1)'),:) =[];
(附)一些有用的命令
======================================================================
1、更改文件/文件夹名称 system ('rename name1 name2'); 把name1改成name2的名字
2、字符串拼接 file=strcat('D:data',year,'met_',sitename);
3、load的简单用法 data=load(file1,'-ASCII');
4、save的简单用法 save(filename,'data','-ASCII'); data是代码中某个变量,此处必须加引号
5、saveas saveas(gcf, printname, 'bmp') ;%此处printname等价“2、”中的file
saveas(i, printname, 'fig'); %此处i和画图时figure(i)一致。
6、find find(isnan(data(:,3):); �ta(:,3)等于NaN的index。 ~isnan()
7、strcmp strcmp(str1,str2); 若str1==str2,返回1;
======================================================================
(11)
=========多幅图subplot的位置、距离设置======2012-09-16===========================
subplot(2,2,1)
subplot(2,2,2)
subplot(2,2,3)
subplot(2,2,4)
%以上不能调整4幅图片的位置。用position可以指定图片位置,例如——
% % subplot('position',[left bottom width height]),分别指定与左侧、下侧的距离和图片宽、高。
subplot('position',[0.07,0.5,0.4,0.4]) % 数值介于[0 1]之间。即整个图为1.0,自己试验来分配
subplot('position',[0.55,0.5,0.4,0.4])
subplot('position',[0.07,0.08,0.4,0.4])
subplot('position',[0.07,0.08,0.4,0.4])
(12)
===============图中多条曲线的多个legend设置======2012-09-16===========================
a=linspace(0,2*pi,100);
y1=100*sin(a);
y2=50*cos(a);
y3=tan(a);
y4=log(a);
y=[y1;y2;y3;y4];
figure
p=plot(a,y);
legend(p(1:2),'sin','cos','location','southoutside','orientation','horizontal');
legend boxoff;
ah=axes('position',get(gca,'position'),...
'visible','off');
legend(ah,p(3:4),'tan','log','location','southoutside','orientation','horizontal');
legend boxon;
%---------------------浩瀚的设置和结果----(Legnd分为两列)--------------------------------
figure;
f1=plot(grc(:,1),grc(:,2),'b-^'); % Timeseries of GRACE
hold on;
f2=plot(gld(:,1),gld(:,2),'r--*'); % Timeseries of GLDAS
title ('GRACE数据和GLDAS模型估计的西南地区总水储量变化')
xlabel('时间(年)');ylabel ('等效水高变化量(cm)');
f3=plot(prec(:,1),data3);
f4=plot(grc(:,1),data_1,'b--','linewidth',1.5); % Linear trend of GRACE
f5=plot(time2,data_2,'r.','linewidth',1.5); % Linear trend of GLDAS
f6=plot(prec(:,1),data_3); % Linear trend of 云南月降水
%====================================
legend([f1;f2;f3],'GRACE水储量变化','GLDAS水储量变化','云南月均降水量变化','location','southoutside','orientation','horizontal');
legend boxon;
ah=axes('position',get(gca,'position'),'visible','off');
legend(ah,[f4;f5;f6],'GRACE水储量变化趋势','GLDAS水储量变化趋势','云南月均降水量变化趋势','location','southoutside','orientation','horizontal');
legend boxon;
[/hide]
|
|