Matlab资料汇总暨MATLAB中文论坛帖子整理(三)

本资料所有问题及代码均摘选自matlab中文论坛,主要供自己学习使用。非常感谢论坛的所有提出以及解答问题的会员。

93、如何同时读入多个文件,并作图?
用下面的方法:把你的文件名放在红色字体标注的语句里,fname={'list.txt','rand.txt',.......};可以全部放入,
然后用下面的代码作图:

方法一:
代码:
clc;clear;
fname={'list.txt','rand.txt'};
num=size(fname,2);
for ii=1:num
filename = textread(fname{ii},'%s');
k = length(filename);

for ii = 1:k
y(ii)=str2double(filename{ii});
% eval(['Data_', num2str(ii), '=D']);
end

figure(ii);

x=1:k;
plot(x,y,'marker','.','markersize',12);


for ii=1:k
line([x(ii) x(ii)],[y(ii) 0]);
end
end
方法二:
clc;clear;
a=dir('*.txt');
n=length(a); %需要读取文件的个数
for i=1:n
name=a(i).name;
filename = textread(name,'%s');
k = length(filename);
for ii = 1:k
y(ii)=str2double(filename{ii});
end
figure('name',name);
x=1:k;
plot(x,y,'marker','.','markersize',12);
for ii=1:k
line([x(ii) x(ii)],[y(ii) 0]);
end
end
方法三:
clc;clear;
a=dir('*.txt'); %读取所有的.dat文件,如 不是dat文件换一下即可
n=length(a); %需要读取文件的个数
for i=1:n
datay=load(a(i).name);
k = length(datay);
y=datay;
x=1:k;
plot(x,y,'marker','.','markersize',12);
for ii=1:k
line([x(ii) x(ii)],[y(ii) 0]);
end
title(a(i).name,'FontSize',20);
filename=deblank(strrep(a(i).name, '.txt', '')); %使图形的名称和数据的名字一致
saveas(gcf,filename,'jpg') %保存当前图形
figure
end

94、MATLAB GUI编程中几个有用的程序段
1、 启动
% 获取当前文件所在路径
currPath = fileparts(mfilename('fullpath'));
% 切换工作路径到当前位置
cd(currPath);
% 判断所用操作系统
if computer == 'PCWIN'
% MATLAB版本号
v = version;
if v(1)~='7'
warndlg ('Only run in matlab 7.x(R14.x)');
return
else
% 添加当前路径下的所有子目录
addpath(genpath(pwd));
addpath(genpath(currPath));
end
end
2、 在GUI中使用Axes控件

% 1.删除所有画线及对应图例
% 查找Axes控件中的画线
sameLines = findobj('type','line');
% 逐一删除这些画线
for i = 1 :length(sameLines)
delete(sameLines(i))
end
% 获取Axes控件中的图例(由于画线全部被删除,因此为空)
lgStr = get(legend(handles.ResultsAxes), 'String');
% 重新设置图例(为空)
legend(handles.ResultsAxes,lgStr);
% 2.添加画线
% 获取原来的图例
lgStr = get(handles.hLegend, 'String');
% 设置下一个画线为添加方式
set(handles.ResultsAxes, 'Nextplot', 'add');
% 指定要画线的Axes
axes(handles.ResultsAxes);
% 画线
plot(distance_target, '-r')
% 添加图例
handles.hLegend = legend(handles.ResultsAxes, lgStr,'目标距离');
% 3.删除某一画线
% 所删除画线对应的数据为distance_target,获取它的句柄
sameLines = findobj('type','line','YData', distance_target);
% 删除画线
if ~isempty(sameLines)
delete(sameLines);
end
% 获取原有的图例
lgStr = get(legend(handles.ResultsAxes), 'String');
% 从原有图例中删除对应图例
legend(handles.ResultsAxes, setdiff(lgStr, {'目标距离'}));
3、 在GUI中使用Excel表格(Activex控件Microsoft Office Spreedsheet)
% 获取现在使用的spreedsheet的句柄
ActiveSheet = get(handles.activex1,'ActiveSheet');
% 现在使用的spreedsheet的现在使用工作薄
ActiveWorkbook = get(handles.activex1,'ActiveWorkbook');
% 现在使用的表
eSheets = handles.activex1.ActiveWorkbook.Sheets;
% 使用表的第一个子表
eSheet1 = eSheets.get('Item', 1);
% 激活该表
eSheet1.Activate;
% 获取当前单元格的句柄
ActiveCell = get(handles.activex1, 'ActiveCell');
% 选择坐标为A1的单元格
Select(Range(ActiveSheet,'A1'));
% 获取当前单元格的句柄
ActiveCell = get(handles.activex1, 'ActiveCell');
% 设置当前单元格中的内容
set(ActiveCell, 'Value', '仿真结果报告');
95、Matlab如何在给定区域随机取点?
例如,给定区域[x y width height],则随机取点的程序为:
x = x + width * rand(1);
y=y+height*rand(1);
96、数据如何导入到workspace中,并执行?在GUI里面,怎么传递处理。
我刚刚上手学习matlab这个功能,有些疑惑。比如我在popmenu里输入了数据,并且转化成double型了,但是我在后面的程序里确无法调用这个数据,conmmand命令框里能显示这个数据的值,但是workspace里确没有~~~。怎么把这个数据读到workspace里面去?
先用assignin命令,把数据存到workspace,再用evalin调用。
assignin:
Assign value to variable in specified workspace
Syntax。
assignin(ws, 'var', val)
evalin
Execute MATLAB? expression in specified workspace
Syntax:
evalin(ws, expression)
[a1, a2, a3, ...] = evalin(ws, expression
v = evalin('base', 'var');
97、matlab下画‘心’的程序。
t=linspace(0,2*pi,1000);
A=1;
x=A*cos(2*t) + 2*A*cos(t);
y=A*sin(2*t) + 2*A*sin(t);
plot(x,y)
fill(x,y,'r')
axis square
98、点到直线的距离怎么求?
已知点的坐标a=[0.3536,1.1036];组成线段的两个点的坐标分别为b=[0.7071,0.5],c=[0,1]
该如何求出点a到线段bc的垂直距离?
方法一、
clc;
clear;
format long
a=[0.3536,1.1036];
b=[0.7071,0.5];
c=[0,1];
ab=sqrt((a(1,1)-b(1,1))^2+(a(1,2)-b(1,2))^2);
ac=sqrt((a(1,1)-c(1,1))^2+(a(1,2)-c(1,2))^2);
bc=sqrt((c(1,1)-b(1,1))^2+(c(1,2)-b(1,2))^2);
cos_theta=(ab^2+bc^2-ac^2)/(2*ab*bc);
juli=ab*sqrt(1-cos_theta*cos_theta);
line([a(1,1) b(1,1)],[a(1,2) b(1,2)]);
line([a(1,1) c(1,1)],[a(1,2) c(1,2)]);
line([c(1,1) b(1,1)],[c(1,2) b(1,2)]);
bd=ab*cos_theta;
cos_theta2=(b(1,1)-c(1,1))/bc;
dx=b(1,1)-bd*cos_theta2;
dy=b(1,2)+bd*sqrt(1-cos_theta2*cos_theta2);
line([dx a(1,1)],[dy a(1,2)]);
ad=sqrt((a(1,1)-dx)^2+(a(1,2)-dy)^2);
str=sprintf('juli=%f,dx=%f,dy=%f',juli,dx,dy);
disp(str);
juli=0.288741,dx=0.186894,dy=0.867845
>>
方法二、解方程
clear,clc,close all;
a=[0.3536,1.1036];
b=[0.7071,0.5];
c=[0,1];
syms x y;
%---------------------------------------------------------
%求解部分,解方程,设垂点 D(x,y)
f1=(y-b(2))./(x-b(1))-(c(2)-b(2))./(c(1)-b(1)); % 斜率 Kbd=Kbc
f2=((y-a(2))./(x-a(1))).*((c(2)-b(2))./(c(1)-b(1)))+1; % 斜率 Kad*Kbc=-1;
[x,y]=solve(f1,f2);x=double(x),y=double(y) %解出垂点 坐标 x y
d=sqrt((x-a(1)).^2+(y-a(2)).^2) % 求垂线距离
%--------------------------------------------------------------
%绘图部分
plot([b(1),c(1)],[b(2),c(2)]);
hold on;
plot(a(1),a(2),'ro','linewidth',5);
plot(x,y,'ro','linewidth',5);
plot([a(1),x],[a(2),y],'k','linewidth',3);
axis([-0.1,0.8,0.4,1.2]);
axis equal
str=strcat('\leftarrow 距离d=',num2str(d));
text((x+a(1))/2+0.01,(y+a(2))/2,str);
text(a(1)+0.02,a(2),'A','fontsize',15);
text(b(1)+0.01,b(2),'B','fontsize',15);
text(c(1)-0.03,c(2),'C','fontsize',15);
text(x-0.02,y-0.03,'D','fontsize',15);
方法三:
clear;clc;
a=[0.3536,1.1036];
b=[0.7071,0.5];
c=[0,1];
k=(b(2)-c(2))/(b(1)-c(1));
b=b(2)-k*b(1);
d=abs(k*a(1)-a(2)+b)/sqrt(k^2+1);

方法四、三维空间中点的坐标
clear;clc;
a=[1,0,0],b=[0,1,1],c=[0,0,2];
line([a(1,1) b(1, 1)],[a(1,2) b(1, 2)],[a(1,3) b(1, 3)]);
line([a(1,1) c(1, 1)],[a(1,2) c(1, 2)],[a(1,3) c(1, 3)]);
line([c(1,1) b(1, 1)],[c(1,2) b(1, 2)],[c(1,3) b(1, 3)]);
xlabel('x');ylabel('y');zlabel('z');
text(1,0,0,'a');
text(0,1,1,'b');
text(0,0,2,'c');
grid on
view(3)

ab=sqrt((a(1,1)-b(1,1))^2+(a(1,2)-b(1,2))^2+(a(1,3)-b(1,3))^2);
ac=sqrt((a(1,1)-c(1,1))^2+(a(1,2)-c(1,2))^2+(a(1,3)-c(1,3))^2);
bc=sqrt((c(1,1)-b(1,1))^2+(c(1,2)-b(1,2))^2+(c(1,3)-b(1,3))^2);
cos_theta=(ac^2+ab^2-bc^2)/(2*ac*ab);
cd=ac*sqrt(1-cos_theta*cos_theta);
ad=ab*cos_theta;
sin_theta2=b(1,3)/ab;
adxy=ad*sqrt(1-sin_theta2*sin_theta2);
adx=1-ad*cos(pi/4);
ady=ad*sin(pi/4);
adz=ad/ab;

str=sprintf('cd=%f,dx=%f,dy=%f,dy=%f',cd,adx,ady,adz);
disp(str)
结果:
cd=1.414214,dx=0.051317,dy=0.948683,dy=0.774597



99、如何绘制正态分布图?
ezplot('25*exp(-(((x-50)/0.2)^2))',[1 100]);
set(gca,'xlim',[30 70]);
100、matlab作图时,如何只保存图像而不显示图像
matlab作图时,如何只保存图像而不显示图像(因批量作图,不用一张一张显示出来,直接保存就可以了)?

for ii=1:10
h=figure(ii);
x=0:0.01:ii;
y=sin(x);
plot(x,y);
set(h,'visible','off'); %不用显示图像
str=sprintf('figure(%d)',ii); %把图像保存为JPG格式的图片文件
saveas(h,str,'jpg');
end
101、在三维图中只显示x,y轴,不显示z轴
figure(1);
[x y]=meshgrid(0:0.01:1);
z=peaks(101);
mesh(x,y,z);
set(gca,'ztick',[],'box','off');
grid on
hold on

[x1 z1]=meshgrid(0:0.01:1,-10:0.2:10);%做垂直于y轴,在y=1处的平面
y1=ones(101);
mesh(x1,y1,z1,'edgecolor',[0.8 0.8 0.8],'facecolor',[0.8 0.8 0.8]);

[y1 z1]=meshgrid(0:0.01:1,-10:0.2:10); %做垂直于x轴,在x=1处的平面

x1=ones(101);
mesh(x1,y1,z1,'edgecolor',[0.8 0.8 0.8],'facecolor',[0.8 0.8 0.8]);

102、cell array和矩阵的显示
A=[ 1 ];
B=[2,3];
C=[4,5;6,7];
D{1}=A;
D{2}=B;
D{3}=C;

>> clear
>> A=[ 1 ]
B=[2,3]
C=[4,5;6,7]
D{1}=A;
D{2}=B
D{3}=C

A =
1
B =
2 3
C =
4 5
6 7
D =
[1] [1x2 double]
D =
[1] [1x2 double] [2x2 double]
>> D{1}
ans =
1
>> D{2}
ans =
2 3
>> D{3}
ans =
4 5
6 7
>>
103、矩阵形式的转换
比如有一个矩阵
1 2
3 4
我想把他扩展成
0 0 0 0
0 1 2 0
0 3 4 0
0 0 0 0
一个通用函数的形式,名称为mat2mat,输入任意矩阵a,就可以返回你想要的结果。
代码:
function b=mattomat(a)
[m n]=size(a);
b=zeros(m+2,n+2);
b(2:m+1,2:n+1)=a;
示例:
代码:
>> a=[1 2 3 4 5 6;1 2 3 4 5 6;1 2 3 4 5 6]

a =

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
>> mat2mat(a)
ans =
0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 0
0 1 2 3 4 5 6 0
0 1 2 3 4 5 6 0
0 0 0 0 0 0 0 0
>>
104、如何判断鼠标是否在figure内的某一区域?
首先,设置x轴和y轴的xlim和ylim属性值,譬如为[0 100]和[0 50];
然后,再windowbuttonmotionFcn中用如下代码:
pos=get(gca,'currentpoint'); %取得鼠标当前的坐标值
if pos(1,1)>=0&&pos(1,1)<=100&&pos(1,2)>=0&&pos(1,2)<=50%判断是否在axes1内,如果在其中,则显示坐标值。
set(handles.edit1,'string',num2str(pos(1,1)));
set(handles.edit2,'string',num2str(pos(1,2)));
end
105、一个有用的程序
G=tf(2.25,[2756.25,105,1],'inputdelay',5);
h=figure(1);
axes();
step(G);
title('¿ª»·½×Ô¾ÏìÓ¦ÇúÏß');
xlabel('time');
ylabel('step response');
grid
K=2.25;T=50,tao=105;
num=2.25;
den=[2756.25 105 1];
G=tf(num,den);
s=tf('s');
%P
PKp=T/(K*tao);
Gk1=PKp*G;
sys1=feedback(Gk1,1,-1);
figure(2);
axes();
step(sys1);
title('P¿ØÖƽ×Ô¾ÏìÓ¦ÇúÏß');
xlabel('time');
ylabel('step response');

%PI
PIKp=0.9*T/(K*tao);
PITi=3*tao;
Gc2=PIKp*(1+1/(PITi*s));
Gk2=Gc2*G;
sys2=feedback(Gk2,1,-1);
figure(3);
axes();
step(sys2);
title('PI¿ØÖƽ×Ô¾ÏìÓ¦ÇúÏß');
xlabel('time');
ylabel('step response');

hold on

%PID
PIDKp=1.2*T/(K*tao);
PIDTi=2*tao;
PIDTd=0.5*tao;
Gc3=PIKp*(1+1/(PIDTi*s)+PIDTd*s);
Gk3=Gc3*G;
sys3=feedback(Gk3,1,-1);
figure(4);
axes();
step(sys3);
title('PID¿ØÖÆÏìÓ¦ÇúÏß');
xlabel('time');
ylabel('response');

106、窗口的最大化、最小化、图标、置顶
matlab 2008a或matlab 2009a环境下,figure的某些隐藏属性进行了优化。
【MATLAB GUI设计学习手记】中讲到,root对象有一个很重要的未公开属性:HideUndocumented(默认值为on)。该属性的作用是隐藏一些matlab不想让大家知道的属性。显示未公开的属性,使用以下命令:
set(0,'HideUndocumented','off')
此时,可以用get(figure)命令查看figure的所有属性(包括未公开的属性)了。
对于root对象的未公开属性,书中已经讲了,这里讲一下figure对象的一个未公开属性:JavaFrame。该属性在使用时会弹出警告:JavaFrame可能会在新的matlab版本中废弃。要关闭该警告,需要先在matlab 2009a命令行输入下列命令:
warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');
现在研究一下JavaFrame属性。
首先,在matlab 2009a命令行输入下列命令:
h=figure;
javaFrame = get(h,'JavaFrame');
get(javaFrame)
命令行输出如下:
UIControlBackgroundCompatibilityMode: 0
ActiveXCanvas: []
AxisComponent: [1x1 com.mathworks.hg.peer.FigureAxisComponentProxy$_AxisCanvas]
Class: [1x1 java.lang.Class]
Debug: 0
Desktop: [1x1 com.mathworks.mde.desk.MLDesktop]
ExposeEvents: []
FigureIcon: [1x1 javax.swing.ImageIcon]
FigurePanelContainer: [1x1 com.mathworks.hg.peer.FigurePanel$2]
GroupName: 'Figures'
Maximized: 0
Minimized: 0
MouseWheelCallback: [1x1 com.mathworks.jmi.Callback]
NativeChildWindowHandle: 0
NativeWindowHandle: 0
NotificationSuccessor: []
UserLastMethodID: 23
UserParentFigure: [1x1 com.mathworks.hg.peer.FigurePeer]
(1)FigureIcon子属性。从字面就知道该属性是设置figure的图标。而其值为: [1x1 javax.swing.ImageIcon]。因此,改变图标的方法如下:
复制内容到剪贴板
代码:
set(javaFrame,'FigureIcon',javax.swing.ImageIcon('icon.jpg')) %icon.jpg为指定的图标
(2)Maximized子属性。该值设置为1时表示窗口最大化。如:
复制内容到剪贴板
代码:
set(javaFrame,'Maximized',1)
(3)Minimized子属性。该值设置为1时表示窗口最小化。如:
复制内容到剪贴板
代码:
set(javaFrame,'Minimized',1)
当然,若要窗口置顶,只需要设置figure的WindowStyle属性为modal。
值得注意的是,最大化属性Maximized在GUIDE创建的GUI中似乎并不好用。
107、连续生成文件名的问题
filename={};
for i=1:50
fname=strcat('image',num2str(i),'.mat');
filename=[filename;cellstr(fname)];
end

108、编辑框edit中输入公式后的绘图问题
在edit text中输入数学表达式,如sin(t),点击push button,可以在axes中显示图形。
代码:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
user_string = get(handles.edit1,'String') ;
str=user_string{1};
syms t
x=0:0.01:8;
y1=sym(str);
y=subs(y1,t,x);
axes(handles.axes1)
plot(x,y);


109、MATLAB中plot命令绘图微调的几个注记 (转自职业仓库)
绘前篇用“Grads平均值输出到硬盘”日志,这里就是用MATLAB来绘折线图。平时用MATLAB不多,因此编写编看帮助文档,整理了一些有用的注记写在这里备忘,也供朋友借鉴。这段M文件注记几点:
1、 MATLAB如何从硬盘读取文件。
2、 如何微调subplot子图的位置。
3、 plot命令绘曲线时,曲线上的标志如何调整大小。
4、 坐标轴的调整。
5、 box on命令
6、 坐标标题中如何标上标。
7、 如何调整图示(legend)的位置。
8、 以上内容在MATLAB帮助文档中有更详细内容。这里的代码只是我实用中的一个例子。代码如下,红色字体为日志注记,非代码一部分。
clear;
%----------------------------------------------
% NH Radiative Effect Mod-Noall
读取硬盘有格式文件数据的写法。
fid_bc=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_NH\bc.dat','r');
bc = fscanf( fid_bc, '%f', [1,12]);
fclose( fid_bc );
fid_nit=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_NH\nit.dat','r');
nit = fscanf( fid_nit, '%f', [1,12]);
fclose( fid_nit );
fid_sul=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_NH\sul.dat','r');
sul = fscanf( fid_sul, '%f', [1,12]);
fclose( fid_sul );
fid_poa=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_NH\poa.dat','r');
poa = fscanf( fid_poa, '%f', [1,12]);
fclose( fid_poa );
fid_soa=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_NH\soa.dat','r');
soa = fscanf( fid_soa, '%f', [1,12]);
fclose( fid_soa );
%----------------------------------
这里要画一个2*2共4幅子图。先将第1个子图的位置调整。
h = subplot( 2, 2, 1, 'replace' );先让MATLAB默认绘制第1幅子图,h是子图1的句柄
po = get( h, 'Position' );get命令从句柄h中获取'Position'的内容,返回一个含4个元素的一维数组放到po中。这4个元素分别是子图1的left, bottom, width, height。
subplot( 2, 2, 1, 'replace' );重新绘制子图1
subplot('Position',[po(1)+0.03,po(2)-0.03,po(3),po(4)]);
子图1的新位置可以这样调整
%----------------------------------
box on;box on命令使得子图在top、right皆绘制坐标轴。这样比较好看,见国外很多文献中的图都是这样画的。
hold on;
axis([0 13 -3 2]);
set( gca, 'XTick', [1:12] );gca表示当前对象句柄,set命令分别对当前对象(即子图1)设置坐标轴XTick和YTick属性。这两个属性分别表示了坐标轴的实际绘值范围。
set( gca, 'YTick', [-3:1:2] );
title( 'The North Hemisphere' );
plot( 1:12, bc, '-r.', 'MarkerSize', 10 );子图1中第1条曲线用实线绘,带有圆点,红色。MarkerSize属性设置圆点的大小是10。这样画出来的就是实心圆了。
plot( 1:12, nit, '-b.', 'MarkerSize', 10 );
plot( 1:12, sul, '-g.', 'MarkerSize', 10 );
plot( 1:12, poa, '-m.', 'MarkerSize', 10 );
plot( 1:12, soa, '-k.', 'MarkerSize', 10 );
%zeroArr = zeros( 14 );
%plot( 0:13, zeroArr, '--k' )
xlabel( 'Month' );
ylabel( 'Radiative Effect (Wm^-^2)' );单位里有上标,^表示后续一个字符为上标。
下述代码绘子图2、3、4,雷同。
%-----------------------------------
% NH Radiative Forcing Fut-Mod 子图2
fid_bc=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_NH\bc.dat','r');
bc = fscanf( fid_bc, '%f', [1,12]);
fclose( fid_bc );
fid_nit=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_NH\nit.dat','r');
nit = fscanf( fid_nit, '%f', [1,12]);
fclose( fid_nit );
fid_sul=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_NH\sul.dat','r');
sul = fscanf( fid_sul, '%f', [1,12]);
fclose( fid_sul );
fid_poa=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_NH\poa.dat','r');
poa = fscanf( fid_poa, '%f', [1,12]);
fclose( fid_poa );
fid_soa=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_NH\soa.dat','r');
soa = fscanf( fid_soa, '%f', [1,12]);
fclose( fid_soa );
%----------------------------------
h = subplot( 2, 2, 3, 'replace' );
po = get( h, 'Position' );
subplot( 2, 2, 3, 'replace' );
subplot( 'Position', [po(1)+0.03, po(2)+0.03, po(3), po(4)]);
%----------------------------------
box on;
hold on;
axis([0 13 -3 2]);
set( gca, 'XTick', [1:12] );
set( gca, 'YTick', [-3:1:2] );
%title( 'NH Fut-Mod' );
plot( 1:12, bc, '-r.', 'MarkerSize', 10 );
plot( 1:12, nit, '-b.', 'MarkerSize', 10 );
plot( 1:12, sul, '-g.', 'MarkerSize', 10 );
plot( 1:12, poa, '-m.', 'MarkerSize', 10 );
plot( 1:12, soa, '-k.', 'MarkerSize', 10 );
%zeroArr = zeros( 14 );
%plot( 0:13, zeroArr, '--k' )
xlabel( 'Month' );
ylabel( 'Radiative Forcing (Wm^-^2)' );
%------------------------------------
% SH Radiative Effect Mod-Noall 子图3
fid_bc=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_SH\bc.dat','r');
bc = fscanf( fid_bc, '%f', [1,12]);
fclose( fid_bc );
fid_nit=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_SH\nit.dat','r');
nit = fscanf( fid_nit, '%f', [1,12]);
fclose( fid_nit );
fid_sul=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_SH\sul.dat','r');
sul = fscanf( fid_sul, '%f', [1,12]);
fclose( fid_sul );
fid_poa=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_SH\poa.dat','r');
poa = fscanf( fid_poa, '%f', [1,12]);
fclose( fid_poa );
fid_soa=fopen('D:\_CurrentPaper\RadiativeForcing\ModNoall_SH\soa.dat','r');
soa = fscanf( fid_soa, '%f', [1,12]);
fclose( fid_soa );
%----------------------------------
h = subplot( 2, 2, 2, 'replace' );
po = get( h, 'Position' );
subplot( 2, 2, 2, 'replace' );
subplot( 'Position', [po(1)-0.03, po(2)-0.03, po(3), po(4)]);
%----------------------------------
box on;
hold on;
axis([0 13 -1.2 0.8]);
set( gca, 'XTick', [1:12] );
set( gca, 'YTick', [-1.2:0.4:0.8] );
title( 'The South Hemisphere' );
plot( 1:12, bc, '-r.', 'MarkerSize', 10 );
plot( 1:12, nit, '-b.', 'MarkerSize', 10 );
plot( 1:12, sul, '-g.', 'MarkerSize', 10 );
plot( 1:12, poa, '-m.', 'MarkerSize', 10 );
plot( 1:12, soa, '-k.', 'MarkerSize', 10 );
%zeroArr = zeros( 14 );
%plot( 0:13, zeroArr, '--k' )
xlabel( 'Month' );
%ylabel( 'Radiative Effect (Wm^-^2)' );
%-------------------------------------------
% SH Radiative Forcing Fut-Mod 子图4
fid_bc=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_SH\bc.dat','r');
bc = fscanf( fid_bc, '%f', [1,12]);
fclose( fid_bc );
fid_nit=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_SH\nit.dat','r');
nit = fscanf( fid_nit, '%f', [1,12]);
fclose( fid_nit );
fid_sul=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_SH\sul.dat','r');
sul = fscanf( fid_sul, '%f', [1,12]);
fclose( fid_sul );
fid_poa=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_SH\poa.dat','r');
poa = fscanf( fid_poa, '%f', [1,12]);
fclose( fid_poa );
fid_soa=fopen('D:\_CurrentPaper\RadiativeForcing\FutMod_SH\soa.dat','r');
soa = fscanf( fid_soa, '%f', [1,12]);
fclose( fid_soa );
%----------------------------------
h = subplot( 2, 2, 4, 'replace' );
po = get( h, 'Position' );
subplot( 2, 2, 4, 'replace' );
subplot( 'Position', [po(1)-0.03, po(2)+0.03, po(3), po(4)]);
%----------------------------------
box on;
hold on;
axis([0 13 -1.2 0.8]);
set( gca, 'XTick', [1:12] );
set( gca, 'YTick', [-1.2:0.4:0.8] );
%title( 'SH Fut-Mod' );
plot( 1:12, bc, '-r.', 'MarkerSize', 10 );
plot( 1:12, nit, '-b.', 'MarkerSize', 10 );
plot( 1:12, sul, '-g.', 'MarkerSize', 10 );
plot( 1:12, poa, '-m.', 'MarkerSize', 10 );
plot( 1:12, soa, '-k.', 'MarkerSize', 10 );
%zeroArr = zeros( 14 );
%plot( 0:13, zeroArr, '--k' )
xlabel( 'Month' );
%ylabel( 'Radiative Forcing (Wm^-^2)' );
我将legend放在了子图4上。
gca=legend( 'BC', 'Nitrate', 'Sulfate', 'POA', 'SOA', 4 );
4表示把legend放在子图的右下角,还有几个数字的含义是:
0 = Automatic "best" placement (least conflict with data)
1 = Upper right-hand corner (default)
2 = Upper left-hand corner
3 = Lower left-hand corner
4 = Lower right-hand corner
-1 = To the right of the plot
po=get( gca, 'Position' ); 发现这样放置后legend要挡住图,因此需要再微调一下。获得legend的'Position'值。
set( gca, 'FontSize', 8, 'Position', [po(1)-0.01, po(2)+0.01, po(3), po(4)] ); 重新设置legend的位置,同时设置legend里面的字体为8号。
legend('boxoff');不画legend的外框。
强调的是上述调整legend的值要不断地试。因为legend相对子图的位置还要随画图窗口大小变化而变化。如果你看不懂这句,试试就知道了。
110、MATlab 三维图中显示z坐标轴的极大极小值
画了一个三维图,想在这个图上用一个竖着的条 两端表示出z的最小值和最大值 及其中间的一些数值。

[x y]=meshgrid(0:0.1:10);
z=peaks(101);
mesh(x,y,z);
minZ=min(min(z));
maxZ=max(max(z));
str1=sprintf('%f',minZ);
str2=sprintf('%f',maxZ);
colorbar('YTickLabel',...
{str1,'','','','','','',str2})

111、如何一次性清空GUI程序的handles结构中的变量
在处理第一个文件时,产生了
handles.a.a
handles.a.b
handles.b
handles.c
....
等N个变量。

处理完成后。打开第二个文件时,发现这些变量还一直存在。
这导致对第二个文件处理的失败。

在打开第二个文件,调用function openavi_Callback(hObject, eventdata, handles)时
handles.a.a
handles.a.b
handles.b
handles.c
....
等N个变量依然存在。

请问有什么命令可以较简单的把这些变量一次清除掉。希望不用在function openavi_Callback(hObject, eventdata, handles)之前
打n句clear handles.a,handles.b....
解决办法:
在处理第一个文件的前面,用下面的语句:
handlesOld=guidata(hObject);%取得handles结构的最初值,并保存
handles.handlesOld=handlesOld;
guidata(hObject,handles);
在处理第二个文件的前面,用下面的语句:
handles=handles.handlesOld;%回复handles结构的值为文件处理前的初值
guidata(hObject,handles);
注意:以上语句均是在控件的callback中实现的。这样,中间加在handles结构上的变量都一次性清除了。
112、Matlab如何给元胞中的每个一维向量前增加同一个数?
如何给元胞中的多个一维向量前增加同一个数?比如:
原cell = { [1 2 3 ];[ 4 5 6 7 ];[6 7]}
要在该cell中每一个向量前增加一个9得到:
cell = { [9 1 2 3 ];[ 9 4 5 6 7 ];[9 6 7]}

用下面的代码就可实现:
>> clear
>> cell = { [1 2 3 ];[ 4 5 6 7 ];[6 7]}
cell =
[1x3 double]
[1x4 double]
[1x2 double]
>>cell(1)=mat2cell([9 cell2mat(cell(1))])
cell =
[1x4 double]
[1x4 double]
[1x2 double]
>>
或者:
cell{1}=[9 cell{1}];
cell{2}=[9 cell{2}];
cell{3}=[9 cell{3}];
celldisp(cell)
cell{1} =
9 1 2 3
cell{2} =
9 4 5 6 7
cell{3} =
9 6 7
113、用guide生成的不同GUI之间控件的互相操作
利用matlab的guide来生成GUI程序,界面布局直观、方便,缺点就是都需要拖带一个m文件和fig文件,...。不过,我还是偏向于这种编程方式,因为要写的代码少,符合我这种懒人的习惯,呵呵。
前面有会员提出问题:如何在不同的GUI之间相互操作其中的控件?
如果程序是由matlab的GUIDE生成的,处理起来比较简单。下面就说说我的一点经验:
每个GUI程序都生成一个handles结构,该handles结构和该GUI是紧密关联的。handles结构中储存了该GUI中figure以及所有控件(pushbutton、edit、statictext、slider、axes、table、等等)的句柄。我们知道,matlab提供了利用句柄来操作句柄所对应的对象的方法,就是set和get函数。
对handles结构的更新和获得是通过guidata函数来实现的。guidata函数的原型在help中有明确的定义:
guidata(object_handle,data);%保存与object_handle相关联的结构data
data = guidata(object_handle);%取得与object_handle相关联的结构,并赋值给data
因此,利用guidata来取得与GUI相关联的handles结构,就间接地取得了其中控件的句柄,利用该句柄,并用set和get函数就可以实现对控件的操作。
例如:设计两个GUI界面,实现通过一个界面的PUSHBUTTON设置另一个界面中EDIT的值,两个界面是同时打开着的。
1、这个问题是主GUI操作从GUI中的控件的问题
可以这样来实现:
假设两个GUI分别为gui1和gui2,在gui1中有button1,在gui2中有edit1。在gui1的pushbutton中gui2并显示,然后设置gui2中的edit中的值为想要的数值:
在gui1 的button1的callback中用以下代码:
hGUI2=gui2();%打开gui2,同时取得gui2的figure的句柄
handles_of_gui2=guidata(hGUI2);%利用gui2的figure的句柄,通过guidata,得到其handles结构
set(handles_of_gui2.edit1,'string','content from gui1!');%利用得到的handles结构取得gui2中的eidt1的句柄,并用set设定其数值
2、如何实现在从GUI中操作主GUI中的控件呢?即在gui2中操作gui1中的控件
假设gui1中也有一个edit控件,tag为edit2,在gui2中也有一个button,‘tag’为button2。实现在gui2中用button2来设置
gui1中的edit2的数值,方法如下:
(1)在gui1的button1的callback中用下面的语句:
hGUI2=gui2(handles.figure1);%把gui1的figure的句柄传给gui2
%其它语句不变
(2)在gui2的OpeningFcn函数中用下面的语句:
handles_of_gui1=guidata(varargin{1});%取得和figure1相关联的gui1的handles结构
handles.handles_of_gui1=handles_of_gui1;
guidata(hObject,handles);%把handles_of_gui1保存到gui2的handles结构中,以方便gui2的其它callback调用
(3)在gui2的button2的callback函数中:
mainhandles=handles.handles_of_gui1;
set(mainhandles.edit2,'string','content from gui2!');
从以上可以看出,handles结构其实是为用户提供了一种比较方便的在不同gui之间共享数据的方法。
114、自定义Matlab figure 工具栏按钮
若将 figure 窗口的 Toolbar 属性设置为 figure,则可以出现 Matlab 图形工具条,里面包括文件打开保存,图象放大、缩小等按钮。但实际使用过程中可能用不了这么多功能,需要将其中的一些按钮删除。那么就可以采用下面的函数保留我们想要的按钮:
function KeepToolbarButton(fig, keep_reg)
% KEEPTOOLBARBUTTON - customize the figure toolbar
% @param toolbar

% handle of the fig containing toolbar
% @param keep_reg
% the regular expressions for buttons which are to be left
%
% Notice: the tags of the uitoolbar buttons are as follows:
% 'Plottools.PlottoolsOn'
% 'Plottools.PlottoolsOff'
% 'Annotation.InsertLegend'
% 'Annotation.InsertColorbar'

% 'Exploration.DataCursor'
% 'Exploration.Rotate'
% 'Exploration.Pan'
% 'Exploration.ZoomOut'
% 'Exploration.ZoomIn'
% 'Standard.EditPlot'
% 'Standard.PrintFigure'
% 'Standard.SaveFigure'
% 'Standard.FileOpen'

% 'Standard.NewFigure'

% it's curious that findobj won't work here, but `findall' will
toolbar = findall(fig, 'type', 'uitoolbar');
% it's curious that get(toolbar, 'Children') won't work here,
% but `allchild' will
toolbar_children = allchild(toolbar);
for m = 1:size(toolbar_children, 1)

target = get(toolbar_children(m), 'Tag');
match = regexpi(target, keep_reg);
if isempty(match)
set(toolbar_children(m), 'Visible', 'off');
end

end
只要给定匹配按钮 tag 名称的正则表达式,就可以选择我们想要的按钮,例如:
KeepToolbarButton(handles.figure1, '(zoomout)|(zoomin)|(pan)');
115、matlab 有没有按某个小数位数做四舍五入的函数?
>> a = 3.2435;
>> digits(2)
>> vpa(a)
ans =
3.2
>> digits(3)
>> vpa(a)
ans =
3.24
116、有关矩阵中小于某值的数取整的问题
a(find(a(:)<eps))=floor(a(find(a(:)<eps)));
用一条语句就可以把a矩阵中小于eps的数值取为0了。
117、Matlab表面被截后的部分
请教一下,如何用matlab画出被平面截取后的表面图形。即如图所示,已经得到原表面和用于截的平面的相交图形,现在想得到截后的表面,请帮帮我哦。

假设为surfc(x1,y1,z1),截取的平面是z=z0; 可令z1中小于z0的元素等于NaN,大于z0的元素保持不变,然后用surfc重新绘图。

[X,Y,Z] = peaks(30);

figure(1);
surfc(X,Y,Z);

Z(Z(:)<=1.0)=NaN;
figure(2);
surfc(X,Y,Z);
set(gca,'zlim',[-10 10]);


118、如何是imshow显示的图像充满整个figure?
logo1 = '5.jpg';
figure;
imshow(logo1,'Border','tight')


119、图像颜色统计直方图
ii=imread('5.jpg');%5.jpg是256x256的灰度图,gray image
x=1:256;
figure;
hist(ii,x);



120、Matlab如何将大元胞数组写入到txt文件
例如R是个24X23的cell结构的矩阵,把其写入到myfile.txt中:
1、数据写入:
clc;clear;
BMP= imread('Hehua_BMP88.bmp');%24*32*3的矩阵
[m,n,z]=size(BMP);%m=24,n=32
R={};
for i = 1 : m
for j = 1:n
R{i,j} = dec2hex(BMP(i,j,1),2);%转换为十六进制,占两位,如3C
end
end
dlmwrite('myfile.txt', R, 'delimiter', '\t');%写入myfile.txt文件中,如果myfile.txt不存在,则自动创建
2、数据读取:
t=textread('myfile.txt','%s');%读取txt文件中的内容
T={};%定义空的cell结构的矩阵
for ii=1:2:length(t)
t1=sprintf('%s%s',t{ii}, t{ii+1}); %把两位合成为一个字符串‘3C’
T=[T; cellstr(t1)];%cell矩阵扩展
end
result=reshape(T,24,32);%重新整理成24X32的 cell类型的矩阵
121、构造特殊矩阵(右螺线状的)
clc;clear;
n=7;
x=zeros(n,n);
maxlen=ceil(n/2)-1;
flag=mod(n,2);
beginnum=5-flag*3;
if flag==1
%奇数阵
x(maxlen+1,maxlen+1)=1;
for i=1:maxlen
x(maxlen+2-i:1:end-maxlen+i,end-maxlen+i)=beginnum:beginnum+2*i-1;
beginnum=beginnum+2*i;
x(end-maxlen+i,end-maxlen+i-1:-1:maxlen+1-i)=beginnum:beginnum+2*i-1;
beginnum=beginnum+2*i;
x(end-maxlen+i-1:-1:maxlen+1-i,maxlen+1-i)=beginnum:beginnum+2*i-1;
beginnum=beginnum+2*i;
x(maxlen+1-i,maxlen+2-i:1:end-maxlen+i)=beginnum:beginnum+2*i-1;
beginnum=beginnum+2*i;
end
else
%偶数阵
x(maxlen+1,maxlen+1:1:maxlen+2)=1:2;
x(maxlen+2,maxlen+1:1:maxlen+2)=4:-1:3;
for i=1:maxlen
x(end-maxlen+i-1:-1:maxlen+1-i,maxlen-i+1)=beginnum:beginnum+2*i;
beginnum=beginnum+2*i+1;
x(maxlen+1-i,maxlen+2-i:1:end-maxlen+i)=beginnum:beginnum+2*i;
beginnum=beginnum+2*i+1;
x(maxlen-i+2:1:end-maxlen+i,end-maxlen+i)=beginnum:beginnum+2*i;
beginnum=beginnum+2*i+1;
x(end-maxlen+i,end-maxlen+i-1:-1:maxlen-i+1)=beginnum:beginnum+2*i;
beginnum=beginnum+2*i+1;
end
end
disp(x)

43 44 45 46 47 48 49
42 21 22 23 24 25 26
41 20 7 8 9 10 27
40 19 6 1 2 11 28
39 18 5 4 3 12 29
38 17 16 15 14 13 30
37 36 35 34 33 32 31
122、figure中多坐标轴中曲线的legend标注
把要标注的曲线的句柄和字符串包含到legend中:
figure(1);
h2=axes('position',[0 0 1 1]);
axis(h2);
x2=0:pi/50:2*pi;
y2=sin(x2);
h3=plot(x2,y2,'b-');
h1=axes('position',[0.3 0.2 0.4 0.4]);
axis(h1);
x1=0:pi/50:2*pi;
y1=cos(x1);
h4=plot(x1,y1,'r-');
hold on
h=[h3; h4];
str=['大图中的曲线';'小图中的曲线'];
legend(h,str);

123、GUI中鼠标选中并显示曲线的类型及坐标
问题:
1, 如果我一个figure上画了两条曲线, 比如一条正弦一条余弦, 如何才能实现当我把鼠标移到正弦曲线上时, 能显示出一个注释框之类的, 说明这是条正弦曲线, 同理移到余弦曲线上时也能显示出这样的注释框?
2, 类似的问题, 鼠标移动到曲线上某一点时时, 如何才能显示出这一点的坐标呢? 不通过figure的工具栏选择, 想直接通过鼠标移动到图上就能显示坐标。 觉得很有实际意义,于是花点时间编写程序,初步实现了这个想法。
程序说明:
程序中绘制了两条曲线,分别是正弦曲线和余弦曲线(其它曲线的道理是一样的),当鼠标移动到各条曲线上时,分别显示曲线的类型以及当前的坐标值。
程序中利用了legend以及条件判断语句。

初始化代码:OpeningFcn函数
% --- Executes just before fftexpand is made visible.
function fftexpand_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to fftexpand (see VARARGIN)

% Choose default command line output for fftexpand
handles.output = hObject;

x=0:pi/50:2*pi;
y=sin(x);
y1=cos(x);

axes(handles.axes1);
h1=plot(x,y,'color',[1 0 0],'linewidth',2);
hold on
h2=plot(x,y1,'color',[0 0 1],'linewidth',2);

handles.h1=h1; %保存曲线的句柄,供legend函数使用
handles.h2=h2;

% Update handles structure
guidata(hObject, handles);

核心代码:编辑WindowButtonMotionFcn函数
% --- Executes on mouse motion over figure - except title and menu.
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
% hObject handle to figure1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
h1=handles.h1;
h2=handles.h2; %取得先前保存的句柄

point=get(gca,'currentpoint'); %取得坐标轴中当前的坐标值
xlim=get(gca,'xlim'); %取得x轴和y轴的最大显示区域的尺寸
ylim=get(gca,'ylim');
if point(1,1)>0&&point(1,1)<7&&point(1,2)>-1&&point(1,2)<=1%判断鼠标是否在坐标轴显示的区域
x=point(1,1);y=point(1,2);
y1=sin(x);
y2=cos(x);
str1=sprintf('正弦曲线\n x=%f,y=%f\',x,y1);
str2=sprintf('余弦曲线©\n x=%f,y=%f',x,y2);
if abs(y1-y)<=abs(y2-y)&&(abs(y1-y)<0.01||abs(y2-y)<0.01)%判断鼠标是否实在正弦曲线附近
legend(h1,str1,'location','southwest');
elseif abs(y1-y)>abs(y2-y)&&(abs(y1-y)<0.01||abs(y2-y)<0.01) %判断鼠标是否是在余弦曲线附近,(abs(y1-y)<0.01||abs(y2-y)<0.01)判断鼠标是否在曲线附近
legend(h2,str2,'location','southwest');
else
legend('off'); %否则,关闭legend
end
end




124、Matlab中y=1\x围绕y轴旋转形成的旋转曲面
代码一:
clear
clc
[x,y]=cylinder(1:0.2:5,100);
mesh(x,y,1./sqrt(x.^2+y.^2))
代码二:
%原来在二维时的最小和最大的x值
xmin=1;
xmax=3;
%确定y的范围
ymax=1/xmin;
ymin=1/xmax;
[x,z]=meshgrid(-xmax:0.01:xmax);
r=sqrt(x.^2+z.^2);
y=1./r;
%将不在范围内的值消去
[r,c]=find(y>ymax);
y(sub2ind(size(y),r,c))=NaN;
[r1,c1]=find(y<ymin);
y(sub2ind(size(y),r1,c1))=NaN;
%画图
mesh(x,z,y);
hold on
mesh(x,z,-y);
hold off


125、GUI程序一开始以‘最大化’显示的问题
在Outputfcn函数的最后添加如下语句:
javaFrame = get(gcf,'JavaFrame');
set(javaFrame,'Maximized',1)
就可以实现GUI窗口一开始便以‘最大化’的形式显示。
126、如何实现文本自动转换
假定在文本框中输入kkLL,则自动转化为快快乐乐。现在假设有很多这样的待转换字符对,存于记事本中,在输入框中一旦“遇到”记事本中的英文代码,则自动转换为对应的中文代码,如果没遇到,则不用转换。
记事本内容举例如下:
kkll 快快乐乐;ggxx 高高兴兴;ppaa 平平安安

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
string_edit=get(handles.edit1,'string');
fid=fopen('wo.txt','r');
str=fgetl(fid);
[str1 str2]=strread(str,'%s %s','delimiter',' ');
text=cell(3,2);
text{1,1}=str1;
text{1,2}=str2;
counter=3;
strout='';
while feof(fid)==0
str=fgetl(fid);
[str1 str2]=strread(str,'%s %s','delimiter',' ');
text{counter-1,1}=str1;
text{counter-1,2}=str2;
counter=counter+1;
end
for ii=1:3
if strcmp(text{ii,1},string_edit)
strout=text{ii,2};
end
end
if ~isempty(strout)
set(handles.edit1,'string',strout);
end

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值