小言_互联网的博客

DAY6 MATLAB学习笔记—编程技巧、 通过命令和工具调试matlab以及错误分析、M文件和matlab程序性能分析

396人阅读  评论(0)

清空环境变量及命令:
clear all
clc
MATLAB编程习惯与风格:
两个%%+空格可以进入cell mode 模式、publish使用、可以自动生成目录,一定要加空格
x_coordinate = rand(1,10);%10个随机x值
y_coordinate = rand(1,10);%10个随机y值,均在0~1之间
figure
plot(x_coordinate,y_coordinate,’-*’)%根据坐标产出实线图像
如何publish:不同的版本publish不一样,形成文件以后点击目录就可以看到对应的内容。
MATLAB程序调试: 学会看错误信息并分析出错原因
1、Subscript indices must eirher be real positive integers or logicals.
A = [1 2 3 4 5];
A(0)%MATLAB所有矩阵、行向量都是以1开始的,0不存在
A(3.5)
A(-2)%Index exceeds matrix dimensions.
2、Undefined function or variable ‘B’.
B
3、 Inner matrix dimensions must agree.
A = [1 2 3 4 5];
B = [1 2 3];
A *B%不符合两矩阵相乘条件
4、 Function definitions are not permitted at the prompt or in scripts.
function c = add(a,b)
c = a + b;%直接引用函数但是没有编写函数文件
5、 Index out of bounds because numel(A)=5.
A = [1 2 3 4 5];
A(6)%A超过只有5个元素,此命令超出边界
6、In an assignment A(I) = B, the number of elements in B and I must be the same.
A(3) = B;%b是矩阵,A(3)是一个元素,不满足赋值元素的条件
7、Expression or statement is incorrect–possibly unbalanced (, {, or [.
mean(A(1:3)%括号不平衡
8、Too many input arguments.
mean(A,1,2)%输入参数过多
9、循环体的调试:断点调试左边一点,就有了断点,加了断点以后RUN,会有指标指向对应代码;此时在WORKSPACE可以看到各项参数的值,然后SETUP,最后会弹出错误的窗口,这时候再对对应的代码进行修改和测试。
a = 1:100;
b = [];
for i =1:21
%原来i是i=1:21 想找到循环的错误爆发点 怎么调试技巧i,i=21:21
index = 105 - 5 *i;
b = [b a(index)];
end
此程序的错误:a(index)里面的值变成0了
Subscript indices must eirher be real positive integers or logicals.
10. 查看、编辑MATLAB自带的工具箱函数 varargin varargout nargin nargout
edit mean
edit newff
MATLAB内存优化配置:
feature memstats
向量化编程:
1、及时清除不用的变量
a = rand(10000);
b = rand(10000);
clear a
b = rand(10000);
2、 使用变量前,预分配内存空间
clear all
clc
n = 30000;
tic;
for k = 1:n
a(k) = 1;
end
time = toc;
disp([‘未预分配内存下动态赋值长为’,num2str(n),‘的数组时间是:’,num2str(time),‘秒!’])

tic
b = zeros(1,n);
for k = 1:n
b(k) = 1;
end
time = toc;
disp([‘预分配内存下动态赋值长为’,num2str(n),‘的数组时间是:’,num2str(time),‘秒!’])
3、选择恰当的数据类型,访问时间不一样
clear all
clc
n = 300000;
a = 8;
b{1} = 8;
c.data = 8;

tic
for k = 1:n;
a;
end
time = toc;
disp([‘访问’,num2str(n),‘次double型数组时间是:’,num2str(time),‘秒!’])

tic
for k = 1:n;
b{1};
end
time = toc;
disp([‘访问’,num2str(n),‘次cell型数组时间是:’,num2str(time),‘秒!’])

tic
for k = 1:n;
c.data;
end
time = toc;
disp([‘访问’,num2str(n),‘次struct型数组时间是:’,num2str(time),‘秒!’])
4、按列优先循环
clear all
clc
n = 1000;
a = rand(n);
tic
for i = 1:n
for j = 1:n
a(i,j);
end
end
toc

for i = 1:n
for j = 1:n
a(j,i);
end
end
toc
5、循环次数多的变量安排在内层
clear all
clc
tic
a = 0;
for i = 1:1000
for j = 50000
a = a + 1;
end
end
toc

tic
a = 0;
for i = 1:50000
for j = 1:1000
a = a + 1;
end
end
toc
6、 给一些函数“瘦身”
edit mean
clear all
clc
a = rand(1,10000);
tic
b = mean(a)
toc

tic
c = sum(a)/length(a)
toc

图像对象和句柄:
1、 如何设置线条的属性呢?
x = 0:0.01:2* pi;
y = sin(x);
h = plot(x,y);
grid on%加网格
get(h)%开始设置h线条
set(h,‘linestyle’,’-’,‘linewidth’,2,‘color’,‘k’)%黑色实现
2、如何修改网格的间隔呢? gca获得当前坐标体系的句柄 1960009019 l13299109228
set(gca,‘xtick’,0:0.5:7)
set(gca,‘ytick’,-1:0.1:1)
3、如何设置图例的字体及大小呢?
x = 0:0.01:2* pi;
y1 = sin(x);
y2 = cos(x);
plot(x,y1,‘r’)%红色线
hold on
plot(x,y2,’-.b’)%蓝色线
h = legend(‘sin(x)’,‘cos(x)’);%增加图例
set(h,‘fontsize’,16,‘color’,‘k’,‘edgecolor’,‘r’,‘textcolor’,‘w’)%对图例的字体和大小设置
4、如何拆分图例呢?
x = 0:0.01:2*pi;
y1 = sin(x);
y2 = cos(x);
h1 = plot(x,y1,‘r’);
hold on
h2 = plot(x,y2,’-.b’);
ax1 = axes(‘position’,get(gca,‘position’),‘visible’,‘off’);%要把坐标轴关掉,这样才能把图例拆分出来
legend(ax1,h1,‘sin(x)’,‘location’,‘northwest’)
ax2 = axes(‘position’,get(gca,‘position’),‘visible’,‘off’);
legend(ax2,h2,‘cos(x)’,‘location’,‘northeast’)
通过命令程序调试:
clear all;
x=[5,7,9;9,8,9];
y=[5:7;8:10];
a=x./y;
b=x+y;
COMMAND WINDOW:
help debug%查看所有的调试指令
dbstop tiaoshi.m%在某文件的开始添加断点
dbstop tiaoshi.m at 4%在某文件的第四行增加断点
dbstep%单步执行
x%查看X
dbcont%把整个程序执行完成
工具栏调试:
clear all;
x=[1:3;7,3,1;4:6];
y=[1:3;6:8;8:-1 :6];
a=x+y;
b=x-y;
c=x *y;
d=x./y;
就是工具栏里有断点等等。。
错误处理:
1、
clear all;
a=[6 6 6;7 7 4]
b=[1:4;3:6]
try
c=a/b;
d=a+b;
catch
disp(‘错误’);%如果try和catch中间的语句错误,则执行catch和end之间的语句
end
2、
clear all;
while 1
x=input(‘请输入一个正数:’);
if x<=0
error(‘该数是:%d,不是我们要的正数!’,x);
end
end
3、
clear all;
a=9;
if a>4
warning(‘该数%d大于3’,a);
b=a
warning(‘too big’,‘该数%d大于3’,a);
end
M文件分析:
clear all;
a=[1:3;6:8;9:11];
b=magic(3);
c=a+b;
1、主页上有分析代码按键,点击重新运行此报告
会显示:使用分号终止语句可在脚本中取消输出。
2、主页上有运行和计时按键,在运行此代码处填写文件的名称
可以看到详细的信息

提高程序性能:
tips:
1、ctrl+c可以中断大型程序的执行
2、避免使用循环
3、尽量用向量
e.g.:
求矩阵的最大值
clear all;
x=rand(3,4,5);
tic;
m=x(1,1,1);
for i=1:3
for j=1:4
for k=1:5
if x(i,j,k)>m
m=x(i,j,k);
end
end
end
end
m
t=toc %程序运行时间(0.0097)
改进:
clear all;
x=rand(3,4,5);
tic;
switch ndims(x) %获取矩阵的维数
case 2
m=max(max(x));
case 3
m=max(max(max(x)));
%MAX函数具体解释(引用于博主“childboi”的转载文字,侵删).
end
m
t=toc%0.0047
再改进:
clear all;
x=rand(3,4,5);
tic;
m=max(x(: ))
%max是求矩阵的最大元素,里面的矩阵x(:,1)表示矩阵x中第一列所有元素组成的矩阵,同理x(1,:)表示矩阵x中第一行所有元素。
t=toc%0.0019
e.g.
源程序
clear all;
tic;
m=0;
for i=1:10000
m=m+1/i^2;
end
m
t=toc%0.0045
变成向量代替循环
clear all;
tic;
m=0;
i=1:10000;
m=sum(1./i.^2);
m
t=toc%0.0038
e.g.
还没有改进的源程序
clear all;
tic;
for i=1:20000
for j=1:5
H(j,i)=1/(i+j-1);
end
end
toc%0.020735
最外层循环次数少
clear all;
tic;
for i=1:5
for j=1:20000
H(i,j)=1/(i+j-1);
end
end
toc%0.0195
事先给出矩阵的维数
clear all;
tic;
H=zeros(5,20000);
for i=1:5
for j=1:20000
H(i,j)=1/(i+j-1);
end
end
toc%0.015831


转载:https://blog.csdn.net/m0_46378369/article/details/104633099
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场