天行健君子以自强不息网站建设,江西网站做的好的企业文化,成华区微信网站建设推广,深圳瑞仕建设公司作者由于后续课程也要学习Matlab#xff0c;并且之前也进行了一些数学建模的练习#xff08;虽然是论文手#xff09;#xff0c;所以花了几天零碎时间学习Matlab的基础操作#xff0c;特此整理。 基本运算
a55 %加法#xff0c;同理减法
b2^3 %立方
c5*2 %乘法
x 1; …作者由于后续课程也要学习Matlab并且之前也进行了一些数学建模的练习虽然是论文手所以花了几天零碎时间学习Matlab的基础操作特此整理。 基本运算
a55 %加法同理减法
b2^3 %立方
c5*2 %乘法
x 1; %分号用于不显示这样在命令行窗口就没有任何输出
y x 5
eps %浮点数的相对误差
1i^2 %虚数
pi 1.原来不是可有可无的只要写上就代表在命令行窗口中不产生输出 2.虚数也可以是ly 变量和向量
%% 变量
% 输入如果输入的不是正确格式则继续接收直到格式正确
xinput(请输入数字);
yx*2% 数据显示格式
% 修改数据显示格式
format long ,pi % 可以修改为小数点后16位
format short ,pi % 默认short formal四个小数位
% 定义时指定数据显示格式
format short %直接声明为短型
a3.1415926a5
b2
ab %大于
ab %等于
ab %小于
% 如果为真则返回1否则返回0
%% 向量
% 冒号创建开始步长结尾
x2:2:10% linspace函数创建线性间隔变量开始结束元素个数
ylinspace(1,20,10)a[1 2 3 4 5]; % 一行矩阵可以看成是向量的一部分
b[6 7 8 9 10];
ca.*b % 加上. 就表示元素之间的运算
sum(c) % 将c向量的所有元素求和ddot(a,b) % 使用dot函数对两个向量进行点积就是x1y1x2y2……xnyn这个和的结果a[1 2 3 ];
b[6 7 8 ];
ccross(a,b) % 三维向量的交叉积右手法则从a到b就是c的方向pause %用于暂停指令下面的指令暂时不会执行其中ylinspace()是一个较为常见的创建线性变量的方法。 矩阵
基础的不讲首先是矩阵。
%% 矩阵
A[1 2 3; 4 5 2; 3 2 7]
A[1 2 3 4 5 2 3 2 7]
BA %把A进行转置行变列列变行
CA(:) %从左到右从上到下竖向展示矩阵的内容
多种矩阵定义中作者感觉第二种较为常见层次很分明。很少见到A(:)展示A‘注意是转置。
Dinv(A) %求矩阵的逆矩阵注意只有非奇异矩阵行列式值不为0才能求逆矩阵
A*D %A乘A的逆就是单位矩阵E
注意inv(A)是逆矩阵非常常见。并且一定要注意的是只有非奇异矩阵即对应行列式不为0才能有逆矩阵那么如何才能快速求得某一个方阵对应行列式值呢方法如下
det_A det(A)
F[1,2,3;4,5,6;7,8,9]
det_F det(F) %在实际的数值计算中由于浮点数的表示和计算误差得到一个非常接近于0的行列式是可能的。
对于上文的A矩阵可以得到det_A-34很明显不为0对于新建的F矩阵可以得到det_F为 这……这已经很接近于0了那它到底等不等于0啊
原来在实际的数值计算中由于浮点数的表示和计算误差得到一个非常接近于0的行列式是可能的。通常使用一些容差值来决定是否将计算出的行列式值视为0本质上就相当于设置一段趋近于0的区间只要行列式结果位于这个区间就认为求得的行列式值为0即对应方阵为奇异矩阵没有逆矩阵。
tol 1e-10;
if abs(det_F) toldisp(F 是奇异矩阵);
elsedisp(F 不是奇异矩阵);
end
后续可以考虑封装为函数通过这个流程我们就可以对F矩阵是否能求逆矩阵进行判断 然后是创建随机矩阵作者目前这几天还没遇到过使用它的情况
Ezeros(10,5,3) %创建一个10行5列3维的全0矩阵原来3表示3维%%伪随机数伪随机矩阵生成
E(:,:,1) rand(10,5) %rand(m,n)生成m行n列的均匀分布的伪随机数矩阵
%rand(m,n,‘double’)生成指定精度的均匀分布的伪随机数参数还可以是’single’默认情况下rand生成的全是整数randi(10) %开区间0~10貌似只能生成整数E(:,:,2) randi(5,10,5) %参数1界定最大范围。
E(:,:,2) randi([1,6],10,5) %参数1也可以用两个数表示一个区间
另外补充一些矩阵的常见使用
A [1,2,3,4,5,6,5,4,6] % 没有;分割就是一整行
B 1:2:9 %第二个参数为步长不可缺省1 3 5 7 9
B 1:3:9 % 1 4 7
C repmat(B,3,2) %以B矩阵为元素生成3行2列的新的矩阵
D ones(2,4) %生成一个2行4列的全1矩阵
其实通过B1:9来获得行向量还是较为常见的。作者在后续定义初始路径时使用的就是这样的定义方法。zeros(2,3)或者ones(2,3)都是一种类型使用固定的常量定义矩阵。
然后就是矩阵及其元素的四则运算普通的*对应的就是矩阵的乘法若使用.*或者./那么涉及到的就是矩阵对应元素之间的运算了别忘了矩阵相加减是矩阵元素相加减哦
% 矩阵及其元素的四则运算
A [1 2 3 4; 5 6 7 8]
B [1 1 2 2; 2 2 1 1]
C A B
D A - B
E A * B %注意这个是‘转置
F A .* B % .*表示对应元素相乘不是矩阵的乘法
G A / B % 相当于A*B的逆逆矩阵是inv(B)
G A \ B % 相当于B*A的逆
H A ./ B % ./表示对应项相除
在实际操作过程中矩阵转置对于初学者实在是不好区分明明正确表述就是Matlab非要写成逆矩阵B的形式……初学者们一定要注意哈逆矩阵是inv()函数得到的即inverse matrix。
% 矩阵的下标
A magic(5)
% magic幻阵数字是从1到n^2 的整数并且每一行、每一列以及主对角线和副对角线上的数字之和都相等。
% 幻阵常用于密码学、设计与艺术、数学研究和解决某些优化和排列问题
B A(2,3) %取矩阵二行三列元素值
C A(3,:) % :为取全部,那么这条语句表示取第三行
D A(:,4) %取第四列
[m,n] find(A 20) %找到大于20的序号值/矩阵
%取的是索引值n是行m是列
这里取元素值蛮重要A(2,3)就是取矩阵A二行三列的元素表示全部相当于占位符*。 元胞数组 Matlab的元胞数组cell array是一种特殊的数组类型它可以容纳不同类型和大小的数据。与常规数组不同每个元胞可以包含任何类型的数据。 { }法
C {text, [1, 2, 3], 5}; %这里C 是一个包含三个元胞的元胞数组。
% 第一个元胞包含一个字符串第二个元胞包含一个向量第三个元胞包含一个标量。C{1} % 返回 text
C{2} % 返回 [1, 2, 3]
C{3} % 返回 5
C{1} new text; % 修改第一个元胞的内容
通过{ }创建元胞数组比较简单推荐使用。调用元素时注意一定不是平常数组的方法而是同样需要{ }进行元素调用。可以对元胞数组进行简单的函数操作简单看看就行
% 使用 cellfun 函数来对每个元胞应用函数
result cellfun(length, C); % 返回每个元胞的长度831% 可以使用 cellfun 和匿名函数来计算每个向量的和
C {[1, 2, 3], [4, 5], [6, 7, 8, 9]};
sums cellfun((x) sum(x), C); %sums 是一个数组其中包含 C 中每个向量的和。%使用循环来操作元胞数组的内容显示 C 的每个元胞的内容。
for i 1:length(C)disp(C{i});
end
cell( )法
%% 元胞数组2
A cell(1,6) %这行代码创建了一个1行6列的空元胞数组A。
A{2} eye(3) %将一个3x3的单位矩阵赋值给A的第2个元素。
A{5} magic(5) %将一个5x5的幻方矩阵赋值给A的第5个元素。
B A{5}
通过cell函数创建的元胞数组如果数组中的元素比较少建议使用{ }直接初始化。但是如果元素比较多那作者认为使用cell先创建空元胞数组应该是更好地办法吧 结构体
在MATLAB中结构体或称为“结构”是一种数据类型它允许将多个不同类型的数据组合在一起。结构体中的每个数据项都被称为字段每个字段都有一个与之相关的字段名。
作者爱用的定义
student.name 张三;
student.age 20;
student.grade 三年级;就这么简单定义都不定义直接加.表示前者就是结构体后者就是字段。运行结果如下 对于多个同一类型的结构体比如不同的班级可以进行如下定义
class(1).name 张三;
class(1).id 001;
class(1).scores [95, 88, 76];class(2).name 李四;
class(2).id 002;
class(2).scores [89, 92, 85];哇去简直是清晰明了啊 长得像C语言的定义
books struct(name,{{Machine Learning,Data Mining}},price,[30,40]) %包含两个字段name 和 price。
% 为结构体的某个字段分配一个元胞数组你需要使用双大括号 {{}}。books.name %访问结构体的字段
books.name(1)
books.name{1}
这就有的讲了上述代码设置books为结构体其中有两个字段name 和 price。以一个字段一个值这个顺序定义的是不是不难理解
读者可能会发现这name后面怎么跟了{{ }}难道我在学vue在这传递变量了其实在结构体定义中如果要为字段赋元胞数组类型的值那么这个元胞数组就不能是原本的{ }必须要嵌套两层{{ }}才能表示这是个元胞数组不信你看上述代码执行的结果 name(1)和name{1}有什么不同呢不是说元胞数组调用元素使用的是{ }吗不妨我们运行一下 糟了要长脑子了 books.name(1) 返回的是name字段中的第一个元素的单元格而不是单元格中的实际内容。因此返回的是一个包含Machine Learning的1x1元胞数组。 books.name{1} 通过使用花括号 {} 来索引元胞数组可以直接访问单元格中的实际内容。因此这将返回字符串 Machine Learning。 扩展
既然结构体中赋值元胞数组需要{{ }}那么作者想使用{ }给name赋值会出现什么情况呢
books_single struct(name,{Machine Learning,Data Mining},price,[30,40])
books_single(1).name
books_single(1).price
books_single(2).name
books_single(2).price
结果 欸变成1*2的结构体数组了这是怎么回事呢其实这是matlab的规定如果是单个{}则表示将{}中的所有元素分别分配给前面的字段name。在上面的例子中{}的两个值分别赋给name这就使得struct有两个name导致整个的struct变成1*2的结构体数组。
可以通过book(1)这样调用第一个结构体第一个结构体中name被分配第一个值第二个结构体中name被分配第二个值此时price的值在两个结构体中是相同的。 如果同时给price分配两个数和name一样用{}分配那结果和作者想的不同作者以为是笛卡尔积一共是1*4结构体数组没想到还是1*2
books_single2 struct(name,{Machine Learning,Data Mining},price,{[30,40],[50,60]})
books_single2(1).name
books_single2(1).price
books_single2(2).name
books_single2(2).price 所以作者认为单独的{}本质上就是为了方便创建结构体数组的name参数1和price参数1一起然后按照顺序name参数2和price参数2一起构成下一个结构体。那如果再给name增加一个数会发生什么呢
books_single3 struct(name,{Machine Learning,Data Mining,Matlab},price,{[30,40],[50,60]})
结果报错啦name字段是一个长度为3的字符串数组而price字段是一个长度为2的数组的数组。这两个字段的长度不匹配导致了错误。只能让两者长度保持一致或者其中之一为标量值没有{}如上文的books_single。
% 保证结构体字段长度相同
books_single3 struct(name,{Machine Learning,Data Mining,Matlab},price,{30,40,50})
books_single3 struct(name,{Machine Learning,Data Mining,Matlab},price,{{[30,40]},{[50,60]},{[70,80]}}) 流程结构
%% 循环结构
sum0;
for i1:5sumsum1;
end
% 间隔也可以为负数
for a 1.0: -0.1: 0.0disp(a)
end
% 也可以不是常见的循环结构可以是数组
for a [2 3 4 5 6]disp(a)
end
% while循环
i0;
sum0;
while(i10)sumsumi;ii1;
end
fprintf(累加和为 %d \n, sum);%% 分支结构
if sum3成立
else不成立
endswitch sum0case 1disp(sum大于零);otherwisedisp(sum小于等于0);
end
到时候看看具体算法看多了就熟悉了。 基本绘图操作
代码来自于CSDN最火的两个matlab教程。
波形函数绘图
%% 基本绘图操作
%1.二维平面绘图
x 0:0.01:2*pi %定义x的范围第二个参数表示步长
y sin(x)
figure %建立一个幕布
plot(x,y) %绘制当前二维平面图
title(y sin(x)) %标题
xlabel(x) %x轴
ylabel(sin(x)) %y轴
xlim([0 2*pi]) % x坐标值的范围x 0:0.01:20;
y1 200*exp(-0.05*x).*sin(x);
y2 0.8*exp(-0.5*x).*sin(10*x);
figure
[AX,H1,H2] plotyy(x,y1,x,y2,plot); %共用一个x的坐标系在y上有不同的取值
%设置相应的标签
set(get(AX(1),Ylabel),String,Slow Decay)
set(get(AX(2),Ylabel),String,Fast Decay)
xlabel(Time(\musec))
title(Multiple Decay Rates)
set(H1,LineStyle,--)
set(H2,LineStyle,:) 双峰函数绘图
%2.三维立体绘图
t 0: pi/50: 10*pi;
plot3(sin(t),cos(t),t)
xlabel(sin(t))
ylabel(cos(t))
zlabel(t)
%hold on
%hold off %不保留当前操作
grid on %把图片绘制出来在图片中加一些网格线
axis square %使整个图连同坐标系呈方体[x,y,z] peaks(30); %peaks命令用于产生双峰函数或者是用双峰函数绘图
mesh(x,y,z)
grid散点图
%% 数据可视化——散点图
% x表示年龄y1表示人体血压。绘制年龄与血压的关系使用scatter散点图函数
x[75;78;51;82;77;88;41;78;78;61;71;74;62;81;75;64;80;72;51;80;56;73];
y1[208;146;168;149;208;102;130;155;163;154;145;147;143;161;145;120;153;158;123;163;177;148];scatter(x,y1)
scatter(x,y1,r) %填充颜色绘制为红色% 利用向量配置多彩颜色每个点的颜色由c确定。
c linspace(1,10,length(x)); %生成了一个线性间隔的向量c。c的长度与x相同值从1到10。
scatter(x,y1,[],c) %这些值作为颜色数据传递给scatter函数使散点具有从一种颜色渐变到另一种颜色的效果。% 填充并标记散点彩色图
sz 30; % 设置散点的大小为30。
c linspace(1,10,length(x)); %同样利用向量配置多彩颜色
scatter(x,y1,sz,c,filled) %填充散点 多彩填充散点图 条形图
%% 数据可视化——条形图
x {计算机系统基础,汇编语言,信息安全,机器学习}; %x个数一定要与y个数对应
y [94,54,65,87];
%在调用 bar 函数时MATLAB 不支持直接使用字符串数组作为 x 坐标轴标签。您可以使用类别数组 categorical 来解决这个问题。
x categorical(x); % 将x转换为类别数组
% bar(x,y)
b bar(categorical(x), y);
b.FaceColor [0.5 0.7 1]; % 设置为淡蓝色 (RGB 色值)
xlabel(科目) %经过我的深思熟虑我认为还是要保证整个图像的完整性不要仅仅依赖于图题
ylabel(成绩)
title(成绩分布图)函数
简单说明一下在MATLAB中不能在命令窗口中直接定义函数。函数必须保存在一个扩展名为.m的文件中并且文件名必须与函数名相同。这文件的创建左上角新建--函数就会有对应函数模板的文件出现啦 格式为function 输出形参表 函数名输入形参表。对于函数要有以下保证 1.确保文件已经正确保存文件名与函数名匹配且扩展名为.m例如f.m。 2.确保函数文件位于当前的MATLAB工作路径中或者您在调用函数时提供了完整的文件路径。 给个例子
% function 输出形参表 函数名输入形参表
function y funcdemo1(x)
%UNTITLED 此处显示有关此函数的摘要
% 此处显示详细说明
% x为一个整数
if x0y2*x;
elseif x0y0;
elseyx*x;
end
disp(y)
end
到时候调用啊直接调用funcdemo1(x)就行了