本文主要讲了学习 ‘MATLAB教程_台大郭彦甫’ P2_02基本操作与矩阵输入 中的一些心得。
视频地址: https://www.bilibili.com/video/av68228488?p=2
变数
使用“=”可以宣告一个变数。并且在WorkSpace里右以看到这个宣告的变数。
正确 : A=10 ;把10这个数指定给A这个变数
错误: 10 = A ;一个变数必须在左边;
在MATLAB中,大小写的变量是不一样的。例如:
A=10
a=10
则在工作区可以看到两个变量,如下:
在变数中,开头不可以有数字,如下:
变数的类型
在numeric中我们可以看到有single, double, 还有有符号的还有无符号。
例如我们刚才输入的 A= 10, 在工作区双击这个变量,可以看到它的类型。
也可以在命令行窗口输入whos, 查看所有的变数的类型,如下:
有一些特别的变数,是在MATLAB中固定使用的,最好不要用这些关键字:
i,j代表的是复数;Inf:无穷大; eps:很小的数; NaN:不存在的数;
输入 iskeyword 可以查看哪些是关键字:
变数调用的优先级
MATLAB内部调用的时候会根据优先极的顺序开始调用:
优先级最高的是用户自己对变数的定义,再是MATLAB内部的自建函数,例如一些三角函数等;再是子函数,然后私有函数。看如下例子:
cos='This string.';
cos(8)
本来,cos是一个内建的三角函数,但是在这里,把cos 赋值为一串字符串,所以cos(8)相当于这个字符串的第8个字符,为 r,如下:
此时,在工作区可以看到,cos表示的值为 ‘This string.’。已经不是一个三角函数了。
变量的删除
可以使用函数 clear
clear ;删除所有工作区的变数
clear cos; 删除名叫 ‘cos’ 的变数
格式
在MATLAB里面有些固定的格式,根据使用的方便性,可以选择不同的格式。
默认使用的都是 short 格式。 如果要使用长的格式,可以使用 format long, 如下:
format long
shortE和longE分别是显示短的科学计数和显示长的科学计数。 **rat 是分数显示。**有些情况下需要显示分数形式。
这里 hex 为什么显示很奇怪。参考博文:https://blog.csdn.net/weixin_44857688/article/details/112676959
首先了解什么是二进制双精度数字
百度百科对于“二进制双精度数字”的解释:
双精度浮点数(double)是计算机使用的一种数据类型,使用 64 位(8字节) 来存储一个浮点数。C、C++中使用到的双精度浮点数(double)类型是在IEEE二进制浮点数算术标准中定义的。
3、IEEE二进制浮点数算术标准
IEEE二进制浮点数算术标准是一种科学计数法,用符号、指数和尾数来表示。下面是具体的规格:
double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位。
最高位63位是符号位,1表示该数为负,0表示该数为正。
62-52位,一共11位是指数位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上
1023
(
2
10
−
1
)
1023(2^{10}-1)
1023(210−1)
51-0位,一共52位是尾数位。由于浮点数精度问题,整数部分与小数部分一共算够53位即可,最高位的1不写入内存(最终保留下来的还是52位)。
下面通过一个例子来说明。
π
−
>
400921
f
b
54442
d
18
\pi ->400921fb54442d18
π−>400921fb54442d18
3.141592653589793(D) -> 1 1.001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000(B)
。
假设3.1415926535898(D)的双精度IEEE二进制表示为:xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx(B)
。
因为3.1415926535898(D)为正数,第一位符号位为0:0xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx(B)
。
1 1.001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000(B)
的科学计数法表示为1. 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000*2^1(B)
,指数1,尾数1. 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000
。按照规定,指数为1+1023=1024(D)->100 0000 0000(B)
,尾数最高位1省去,所以只剩下1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000:0100 0000 0000 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000 (B)
。
0100 0000 0000 1001 0010 0001 1111 1011 0101 0100 0100 0100 0010 1101 0001 1000 (B) -> 4009 21FB 5444 2D18(H)
。
————————————————
版权声明:本文为CSDN博主「三木青年」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44857688/article/details/112676959
第48页练习题,如下:
分号的使用
在命令行后面,有分号(;)的话,不会显示结果,无分号的话,会显示结果。如下:
但其实MATLAB已经保存了 a=10 这个变数,我们在工作区可以看到,如下:
clc \clear\who\whos
clc :清屏;
clear :移除工作区所有的变数;
who :显示在工作区的变数;
whos :显示在工作区变数的类型;
矩阵
矩阵和向量都是使用 中括号([ ])来显示。
A=[1 2 3 4] ;
B=[1;2;3;4] ;列向量是使用分号(;)来划分一的。
矩阵元素指引
假设,矩阵如下图:
第一种方法,没有使用逗号(,):
A(8) ;表示这个矩阵的第8个元素,在MATLAB里元素是按着一列一列去数,先数第一列,再数第二列,所以A(8)=9
A([1 3 5]) ;方括号里是一组数,表示第1个元素、第3个元素、第5个元素,并且新的元素组成了一个行向量, [1 31 17]
A([1 3; 2 6]) ; 方括号里寻找的元素组成了一个新的矩阵, [ 1 31; 5 2]
如下所示:
第二种方法,里面有使用到逗号(,),如下:
A(3,2) ;表示寻找的是A矩阵的第3行,第2列的元素,则为 2
A([1 3],[1 3]) ;逗号前表示的是行,所以是第1行和第3行,逗号后面表示的是列,所以是第1列和第3列,那么两者相关的地方会
;组成一个新的矩阵,[1 6;31 7]
第71分钟作业
对于最后一问,也可以使用冒号的一个用法。 A(3,:)=[ ]
冒号操作符
<1> 冒号可以做等差算术;
j:k ;作一个从j到k的数列,默认每次加1
j:i:k ;作一个从j到k的数列,默认每次加i,如果快到k时,不够加i,则最后的几个数会忽略掉
<2> 冒号可以选择某一行或列的全部数据,例如:
矩阵组合
假设有矩阵A,矩阵B。可以将A和B组合在一起,变成一个新的矩阵。 例如: F=[A B] ; F=[A;B] ;
注意:在使用的过程中,一定要注意你要组合的两个矩阵是否有相同的列或者行。
矩阵的算法
y3=A.*B ;点乘,就是A矩阵里的第一行的第一个元素乘以B矩阵里的第一行的第一个元素,然后A矩阵的第一行的第二个元素乘
;以矩阵B的第一行的第二个元素,一直如此下去
y5=A./B ;点除,类似于点乘
C=A' ;将矩阵A转置
具体如下:
特殊矩阵
linspace(x1,x2) ;生成x1到x2之间的100个等间距点的行向量
linspace(x1,x2,n) ;生成x1到x2之间的n个等间距点的行向量
eye(n) ;生成n行n列的对角线上全是1的矩阵
zeros(n1,n2) ;生成n1行n2列的全是0的矩阵
ones(n1,n2) ;生成n1行n2列的全是1的矩阵
diag([n1 n2]) ;生成对角线上是方括号内部数据的矩阵。
rand(n1,n2) ;生成n1行n2列随机数矩阵,生成的数为0-1之间
与矩阵相关的函数
max(A) ;找到A矩阵里每一列的最大值,组成一个行向量
max(A') ;找到A矩阵里每一**行**的最大值,组成一个行向量
max(max(A)) ;找到A矩阵里每一列的最大值,组成一个行向量,在这一个行向量里,找到最大的值
min(A) ;找到A矩阵里每一列的最小值,组成一个行向量
sum(A) ;算出A矩阵里每一列的和,组成一个行向量
mean(A) ;算出A矩阵里每一列的平均值,组成一个行向量
sort(A) ;将每一列从小排到大
sortrows(A) ;每一行作为一整体,根据第一列从小到大,其它列整体移动
size(A) ;矩阵A有多少行和多少列
length(A) ;在矩阵A中,如果行比列多,则返回行数,如果列比行多,则返回列数。也就是返回行和列中多的一个
find(A) ;寻找矩阵A中非零元素的位置是多少
find(A==5) ;返回矩阵A中等于5的位置,注意,是位置,而不是数。