MATLAB基础教程学习笔记
%%查看源码
% type 函数名
% open 函数名
% edit 函数名
% 点击出错提示
%%帮助
% doc
% help
% lookfor
%%
�mo演示
tic,...,toc计时
% 循环的速度快于递归
% 直接解更精确,间接方法加大传递误差
% norm(范数)具有\'长度\'的概念,可用来求解误差
%%
% path 列出所有路径
% cd/pwd 打印当前目录
% userpath 用户最初路径
% savepath 保存当前路径到默认路径
% pathtool 设置路径
% pathdef 默认路径
% what 列出当前目录的m文件
% dir/ls 列出当前目录的所有文件
% delete 删除对象
%%matlad的数据类型
% % 变量和语句
% 变量命名
% 字母开头,包括字母、数字、下划线,区分大小写
% 不声明,不定义,拿来即用
% 语句
% 回车则表示一句结束,末尾无分号,则输出该句执行官结果,末尾有分号,只执行,不输出
% 注释以%开头表示
% 一行写不开,用…续行,否则默认这一句已经完毕
% 赋值
% 变量=表达式
% 表达式
% 前者将表达式的值赋值给=前的变量,后者将表达式的值赋值给默认变量ans
% % 变量管理
% 工作空间中驻留的变量查看
% 工作空间窗口显示
% 命令方式
% who
% whos
% 清除变量
% clear命令
% 保存数据
% save命令
% % 数据输出
% format函数
% % 数值型数据
% 最常用的数据类型
% 建立方法
% a = 1;
% 建立double型数据a,值为1,转化,比如
% b = uint8(a);
% a转化为uint8类型(无符号整型,8位)赋值到b中,执行结果a类型不变。
% a = uint8(a);
% a转化为uint8类型。
% a = double(a);
% a转化为双精度类型。
% % 字符串
% 使用单撇号’’括起来的字符序列,比如
% str = ‘This is a string’;
% 字符串操作
% 获取字符ASCII值
% double函数或者abs函数
% double(‘a’);
% 输出字符a的ASCII码
% ASCII转化为字符输出
% char函数
% char(63);
% 输出ASCII码63代表的字符
% 执行字符串内容
% eval函数
% eval_r(‘t = 1’);
% 将字符串’t = 1’作为MATLAB语句执行,即上面的语句执行结果为将1赋值给变量t
% 字符串与数值的互换
% str2num 反之
% num2str 数值转成字符串num to str
% int2str
% mat2str
% % 结构体
% 建立:
% 结构体.成员名 = 表达式
% a.x1 = 1;
% a.x2 = ‘str’;
% a.x3 = [11 12 13];
% 建立结构体a,成员包括三个分别为x1, x2, x3。
% 使用{}括起建立
% a = {1, ‘str’, [11 12 13 14]};
% 结构体操作
% isstruct函数
% fieldnames函数
% isfield函数
% rmfield函数
% getfield函数
%% 矩阵的建立
% 直接输入法
% 在命令窗口直接输入矩阵元素
% 按行输入矩阵元素,同一行元素使用空格或者逗号隔开,不同行元素使用分号或者回车作为间隔
% M文件建立矩阵
% 启动编辑器(输入edit命令,或者使用按钮)
% 输入待建立矩阵,输入格式要求和直接输入法类似,只不过不同行元素必须使用分号作为间隔
% 特殊矩阵建立
% 零矩阵
% 幺矩阵
% 冒号表达式建立向量
% 冒号是一个重要的运算符,语法
% e1:e2:e3
% e1为初始值,e2为步长,e3为终止值,产生行向量,以e1为开始,e3为结束,步长为e2
% linspace建立行向量
% 语法
% linspace(a, b, n)
% a和b分别为行向量的第一个和最后一个元素,n为总元素,省略n自动产生100个元素的行向量
%% 矩阵的简单操作
% 索引矩阵
% 可以使用矩阵元素的行标和列标或者矩阵元素的位置索引来索引矩阵元素
% 行标和列表共同使用的形式
% 使用序号索引,涉及到MATLAB中矩阵的存储形式
% 序号和下标的转换
% 重排矩阵
% reshape函数
% 矩阵转置
% 矩阵拆分
% 使用冒号表达式的拆分技巧
% 扩展
% repmat
% 压缩
% unique
% intersect
%%
%% 一、特殊矩阵的建立
% zeros
% ones
% eye
I = eye(10, 10);
I = eye(10);
% rand randn
S = rand(10, 1);
Sn = randn(1, 10);
% 从0到10之间均匀分布
S = 0 + (10 - 0)*rand(10, 1);
% 从a到b之间均匀分布的随机数
% S = a + (b - a)*rand
% 产生均值为u,方差为s的正态分布的随机矩阵
% y = u + sqrt(s)*randn
y = 0.6 + sqrt(5)*randn(5, 1);
% 魔方矩阵
magic(5)
% Hilbert矩阵和Toeplitz矩阵
hilb(4)
toeplitz(1:6)
%% 矩阵和向量的运算
A = [1 0 0 0; 3 1 0 0; -5 2 1 0; 7 03 2 1];
B = [1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7];
k = 3;
A + B;
k*A;
A\'
det(A)
inv(A)
a = [1 + 5i, 2, 3 + 6i, 7 - 2i];
b = [2 - i, 4 + 3i, 3 - i, 6];
s = sum(conj(b).*a)
s = a*b\'
s = dot(b, a)
%% 线性方程组的求解
A = [1, 2, 3; 1, 4, 9; 1 8 27];
b = [5, -2, 6]\';
x = inv(A)*b
x = A\b
%% 矩阵的相似化简和分解
A = [0 3 3; -1 8 6; 2 -14 -10];
jordan(A)
[V J] = jordan(A)
A = [1 0 i; 0 2 0; -i 0 1];
eig(A)
[E D] = eig(A)
%% 范数
A = [0 3 3; -1 8 6; 2 -14 -10];
norm(A, 1)
norm(A, 2)
norm(A, inf)
norm(A, \'fro\')
%% 矩阵分析
syms x
A = [sin(x) exp(x) 1; cos(x) x^2 + 1 log(x)];
diff(A)
diff(A, 2)
A = [0 1; 0 -2];
expA = funm(A, @exp)
expA = expm(A)
sinA = funm(A, @sin)
cosA = funm(A, @cos)
%%
% 顺序
% 按照代码顺序执行,即顺序结构,受控于代码前后位置;
% 使用于顺序结构中的输入和输出(命令交互):
% 数据输入(input函数)
% 数据显示(disp函数)
% 程序暂停(pause函数)
% 单分支条件
A = input(\'input A\');
if A > 10
disp(A);
end
% 双分支if语句
x = input(\'x\');
if x > 10
y = log(x);
else
y = cos(x);
end
% 多分支if语句
c = input(\'input a character\', \'s\');
if c >= \'A\' & c <= \'Z\'
disp(char(abs(c) + abs(\'a\') - abs(\'A\')));
elseif c >= \'a\' & c <= \'z\'
disp(char(abs(c) - abs(\'a\') + abs(\'A\')));
elseif c >= \'0\' & c <= \'9\'
disp(c);
end
% switch分支
price = input(\'input price\');
switch fix(price/100)
case {0, 1}
rate = 0;
case {2, 3, 4}
rate = 0.03;
case {5, 6, 7, 8, 9}
rate = 0.05;
otherwise
rate = 0.1;
end
% try分支
% try分支
% 在经典的程序设计语言中未出现,这是一种试探性的分支语句,也就是如果这条语句执行有错误,则不执行,或者执行其他的语句,提高了程序的容错性能。
% 语法:
% try
% 语句组1
% catch
% 语句组2
% end
% for循环
A = 1:100;
sumA = 0;
for k = 1:100
sumA = sumA + A(k);
end
% while循环
while 1
c = input(\'input a character\', \'s\');
if isempty(abs(c))
break;
end
end
%%
a = 0;
b = 1;
c = a + b;
a = [1 2 3 4];
b = [1 2 3 4];
c = a .* b;
% % M文件
% 分类
% 命令文件(脚本文件,Script File)
% 函数文件(Function File)
% 区别
% 命令文件没有输入,没有返回;
% 命令文件可以对工作空间的变量操作,结果返回工作空间,而函数文件中的变量为局部变量,函数执行完毕,变量被清除;
% 命令文件可以直接运行,函数文件见需要调用的形式运行(除了特殊的函数文件之外)。
% % 函数文件
% 基本结构
% function [输出形参]=函数名([输入形参])
% [注释说明]
% 函数体
% 关于函数文件名
% 通常和函数名一致,如果不一致,那么忽略函数名,调用时使用函数文件名。
% 注释部分
% 注释部分可以提供help以及lookfor命令的查找功能
% nargin
% nargout
% varargin
% varargout
% 可以完成传递参数的可调功能,类似于高级语言中的函数重载和多态。
% 前两者为输入输出参数个数,后面两个可以代表未知的输入输出变量。
% % 全局变量
% 使用global声明,可以提供不同的M文件访问同一个变量。
% 不同的函数之间访问同一个变量,可以通过返回参数来设置,或者使用全局变量。
% % 程序调试
% 断点和单步;
% 根据错误提示,初步确定错误内容;
%%
function re = add_multi(a, b, c, d)
%
%
% matlab6
if nargin == 4
re = a + b + c + d;
elseif nargin == 3
re = a + b + c;
elseif nargin == 2
re = a + b;
else
error(\'输入参数个数错误\');
end
%%
function re = add_var(a, b, varargin)
%
%
%
error(nargchk(2, 4, nargin));
if nargin == 2
re = a + b;
elseif nargin == 3
c = varargin{1};
re = a + b + c;
elseif nargin == 4
c = varargin{1};
d = varargin{2};
re = a + b + c + d;
else
error(\'wrong\');
end
end
%%
function re = add_my(a, b)
�D_MY 完成变量a和b的相加
% 输入: a加数1
% b加数2
% 输出: re为输入两个参数的加和
%
% $Author:lskyp
% $Date: 2010.7.7
% Version: V1.0
re = a + b;
%%
function [a, b] = add_mu(c, d, e, f)
%
%
%
if nargout == 2
a = c + d + e + f;
b = c * d * e * f;
else
a = c + d + e + f;
end
%%
%% 基本绘图操作
x = 0:0.01:2*pi;
y = sin(x);
plot(x, y);
% % plot函数
% 基本用法
% plot(x, y);
% 要求:x和y为相同长度的向量
% 特殊用法:
% (1)x为向量,y为矩阵,其中一维与x长度相同,则绘制多条不同色彩的曲线(颜色怎么确定?);
% (2)x和y为同维的矩阵,以对应列绘制不同色彩的曲线;
% (3)plot有一个参数,若x为实数向量,则绘制折线图,若x为复数向量,则以实部和虚部为横纵坐标绘图;
% (4)多个输入参数;
% (5)曲线选项
% 第二个参数为矩阵
y1 = sin(x);
y2 = cos(x);
y3 = 0.002*exp(x);
y4 = x;
y5 = 0.002*tan(x);
z = [y1; y2; y3; y4; y5];
plot(x, z)
% 两个参数都是矩阵
x1 = 0:0.01:2*pi;
x2 = -pi:0.01:pi;
x = [x1; x2]\';
y1 = cos(x1);
y2 = sin(x2);
y = [y1; y2]\';
plot(x, y)
% plot只有一个参数
x = linspace(0, 2*pi, 200);
y = sin(x);
plot(y)
y2 = cos(x);
y3 = y + i*y2;
plot(y3)
axis equal % 下面讲解的坐标轴控制
% plot有多个参数
x1 = linspace(0, 2*pi, 200);
x2 = linspace(0, 2*pi, 100);
y1 = cos(x1);
y2 = sin(x2);
plot(x1, y1, x2, y2)
% plot含有的曲线选项
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y, \'k\') % r g y m k b
plot(x, y, \'p\') % * . p < >
plot(x, y, \':\') % - -- -. :
plot(x, y, \'r*:\')
%% 图形标注
% 基本标注函数:
% title
% xlabel
% ylabel
% text
% legend
% 特殊字符的显示
% LaTeX字符简介
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y)
xlabel(\'x\')
ylabel(\'y\')
title(\'正弦\');
text(2, 0.3, \'y = xin(x)\');
text(5, 0.5, \'x_2\')
x1 = linspace(0, 2*pi, 200);
x2 = linspace(0, 2*pi, 100);
y1 = cos(x1);
y2 = sin(x2);
plot(x1, y1, x2, y2)
legend(\'cos\', \'sin\');
xlim([0 10])
%% 图形保持
% 基本控制命令:
% axis equal
% axis square
% axis auto
% axis off
% axis on
% axis([xmin xmax ymin ymax])
% xlim([xmin xmax])
% ylim([ymin ymax])
% 图形保持
% 选择下一次绘图是刷新原有的图形,还是在原有图形基础上再次绘图。
% hold命令
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
hold on
plot(x, y1, \'r\');
plot(x, y2, \'g\');
hold off
%% 窗口分割
% 将图形窗口分割成若干个绘图区域,每个区域绘制一个子图,当然也可以通过上面的hold命令绘制多个子图。
% subplot函数
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);
y3 = tan(x);
y4 = exp(x);
subplot(2, 2, 1)
plot(x, y1);
subplot(222)
plot(x, y2)
subplot(223)
plot(x, y3)
subplot(224)
plot(x, y4)
%% 绘图
% 对象和句柄
% MATLAB把构成图形的各个基本要素称为图形对象,产生每一个图形对象时,MATLAB会自动分配一个唯一的值用于表示这个对象,称为句柄。
% line对象和line函数
% h = line(‘pro’1, val1, ‘pro2’, ‘val2’, …);
% 产生line对象,h为line对象的句柄;
% line对象的修饰:
% Color属性;
% LineWidth属性;
% LineStyle属性;
% Marker属性;
% MarkerSize属性;
% plot绘制的图形也是line对象,可以通过line对象的修饰方法后期修饰
% line对象
% h = line([-pi:0.01:pi], sin([-pi:0.01:pi]));
% hp = plot([-pi:0.01:pi], sin([-pi:0.01:pi]));
hl = line(\'XData\', [-pi:0.1:pi], \'YData\', sin([-pi:0.1:pi]), ...
\'LineWidth\', 1, \'LineStyle\', \':\', \'Color\', \'r\');
set(hl, \'LineWidth\', 2, \'Marker\', \'p\', \'MarkerSize\', 15);
ht = text(0, 0, \'sin\');
set(ht, \'String\', \'cos\');
set(ht, \'FontSize\', 20);
hf = figure;
ha = axes(\'Parent\', hf, \'Units\', \'normalized\', \'Position\', [.1 .1 .6 .5]);
% text对象和text函数
% 修饰:
% Color属性
% String属性
% FontSize属性
% Rotation属性
% axes对象和axes函数
% 修饰:
% Box属性
% GridLineStyle属性
% Position属性
% Units属性
% XLabel、YLabel和ZLabel属性
% Xlim、Ylim和Zlim属性
%%
% 符号变量
a = sym(\'a\');
syms b;
% 符号常量
c = sym(\'3\');
f1 = \'3 * x + 4\';
syms x
f2 = 3 * x + 4;
f3 = sym(\'3*y + 4\');
% 符号四则运算
fadd1 = f1 + f2
fmul = f1 * f2
% 符号表达式化简
syms x y
s = (x^2 + y^2)^2 + (x^2 - y^2)^2;
simplify(s)
simple(s)
% 符号和数值的转换
eval_r(c)
numeric(c)
% 因式分解,展开和合并同类项
syms a b x y;
f1 = a^3 - b^3;
factor(f1)
f2 = (3*x^2 + 8*y^2)*(-x^2 + 3*y);
expand(f2)
f3 = 3*x^2 + 4*x^2 + 5*x^2*y;
collect(f3)
% 符号矩阵
a1 = [x x + y; y y^2]
% 符号函数值的求解
syms x
f1 = x^3 - 9;
subs(f1, 3)
% 符号极限,符号微分,符号积分
syms x a
y = (sin(x + a) - sin(x - a))/x;
limit(y, 0)
y2 = sqrt(1 + exp(x));
diff(y2)
diff(y2, 2)
diff(y2, 3)
y3 = (3 - x^2)^3;
int(y3)
y4 = abs(1 - x);
eval_r(int(y4, 1, 2))
% 符号级数求和
syms n
f = 1/n^2;
s1 = symsum(f, n, 1, inf)
% 泰勒展开
syms x
y = (1 + x + x^2)/(1 - x + x^2);
taylor(y, 6, 1)
% 代数方程
clear
syms x
solve(x + x*exp(x) - 10)
clear
eval_r(solve(\'x + x*exp(x) - 10\'))
% 方程组
[x y] = solve(\'x + y - 98\', \'x^(1/3) + y^(1/3) - 2\', \'x, y\')
[x y] = solve(\'1/x^3 + 1/y^3 - 28\', \'1/x + 1/y - 4\', \'x, y\')
% 微分方程
dsolve(\'Dy - (x^2 + y^2)/x^2/2\', \'x\')