物探论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1865|回复: 3

[其它] 整理一些matlab小代码

[复制链接]
发表于 2013-4-23 20:45:38 | 显示全部楼层 |阅读模式
[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]
回复

使用道具 举报

发表于 2013-6-21 16:24:38 | 显示全部楼层
挺实用的
回复 支持 反对

使用道具 举报

发表于 2013-7-31 15:15:21 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

发表于 2013-10-13 10:02:39 | 显示全部楼层
好好学学了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|物探论坛 ( 鄂ICP备12002012号 微信号:iwutan )

GMT+8, 2024-4-28 06:18 , Processed in 0.072312 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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