4.第四天2022-1-22
4.1 变量转换+初等函数+行向量
>> realmax('double')%双精度的极大值 ans = 1.7977e+308
初等函数:三角函数、求整函数、求符号、求方根、角度弧度互化、对数函数、指数函数
>> fix(-3.5)%向0取整,去掉小数部分,留下整数部分 ans = -3 >> fix(1.5)%向0取整 ans = 1 >> floor(-3.5)%向负无穷取整 ans = -4 >> floor(2.3)%向负无穷取整,地板 ans = 2 >> ceil(19.99)%向正无穷取整,天花板 ans = 20 >> round(1.5)%四舍五入 ans = 2 >> round(pi)%四舍五入 ans = 3 >> round(pi,2)%四舍五入,保留两位小数 ans = 3.1400 >> mod(13,3)%13/3的余数 ans = 1 >> rem(13,3)%13/3的余数 ans = 1 %%mod和rem有轻微的区别 >> sign(1.3)%返回符号,正数、正无穷是1,负数、负无穷是-1 ans = 1 >> sign(-1.3) ans = -1 >> sign(Inf) ans = 1 >> sign(-Inf) ans = -1 >> sign(NaN) ans = NaN >> sign(0) ans = 0 >> sqrt(2) ans = 1.414213562373095 >> nthroot(2,2)%2的平方根 ans = 1.414213562373095 >> nthroot(2,3)%2的立方根 ans = 1.259921049894873 >> deg2rad(180)%角度化为弧度 ans = 3.141592653589793 >> rad2deg(pi)%弧度化为角度 ans = 180 >> log(2.718)%以e为底的对数函数 ans = 0.999896315728952 >> log2(1024)%以2为底的对数函数 ans = 10 >> log10(realmax('double'))%以10为底的对数函数,realmax('double')是双精度的上限 ans = 3.082547155599167e+02 >> exp(1)%e^1 ans = 2.718281828459046 >> exp(10)%e^10 ans = 2.202646579480672e+04 >> 2^3 ans = 8
%matlab:matrix laboratory矩阵实验室
矩阵:二维数组,列向量和行向量是一维数组
>> v=[5 88 3 11] v = 5 88 3 11 >> 3:1:9 %3 4 5 6 7 8 9 ans = 3 4 5 6 7 8 9 >> 9:-1:3 ans = 9 8 7 6 5 4 3 >> 1:2:6 ans = 1 3 5 >> linspace(3,9,7)%等差数列,初始值3,结束值9,一共7个数 ans = 3 4 5 6 7 8 9 >> v=logspace(3,9,7)%等比数列,从10的3次方开始,10的9次方结束,个数是7 v = 1.0e+09 * 1 至 4 列 0.000001000000000 0.000010000000000 0.000100000000000 0.001000000000000 5 至 7 列 0.010000000000000 0.100000000000000 1.000000000000000 >> v(1) ans = 1000 >> v(7) ans = 1.000000000000000e+09 >> v=3:9%没写步数,默认是1 v = 3 4 5 6 7 8 9 >> u=0.1:0.2:0.9 u = 1 至 4 列 0.100000000000000 0.300000000000000 0.500000000000000 0.700000000000000 5 列 0.900000000000000 >> [u v]%组合行向量 ans = 1 至 4 列 0.100000000000000 0.300000000000000 0.500000000000000 0.700000000000000 5 至 8 列 0.900000000000000 3.000000000000000 4.000000000000000 5.000000000000000 9 至 12 列 6.000000000000000 7.000000000000000 8.000000000000000 9.000000000000000 >> v([3 4])%访问v的第三个第四个元素 ans = 5 6 >> v([3 1 3 2 4])%访问v的第3 1 3 2 4个元素 ans = 5 3 5 4 6 >> v(end-1)%访问v的倒数第二个元素 ans = 8 >> v(2:end-1)%访问v的第2个到倒数第二个元素 ans = 4 5 6 7 8 >> v([3 1 3 2 4 end])%访问v的第3 1 3 2 4 和最后一个元素 ans = 5 3 5 4 6 9 >> v(2)=-4%改变第二个元素是-4 v = 3 -4 5 6 7 8 9 >> v(2:4)=[1 2 3]%改变第2-4个元素是123 v = 3 1 2 3 7 8 9 >> v(10)=12%将第十个元素赋值12.不提倡这种超过维度的赋值做法 v = 3 1 2 3 7 8 9 0 0 12 >> a=2:2:8 a = 2 4 6 8 >> b=3:3:24 b = 3 6 9 12 15 18 21 24 >> b(a([4,3]))%b([8,6]) ans = 24 18
4.2 列向量+矩阵
>> [3;7;4] ans = 3 7 4 >> [3 7 4]'%共轭转置 ans = 3 7 4 >> [1+3i 2-7i 5+4i]'%复数转置会显示共轭 ans = 1.000000000000000 - 3.000000000000000i 2.000000000000000 + 7.000000000000000i 5.000000000000000 - 4.000000000000000i >> [1+3i 2-7i 5+4i].'%转置,不是共轭的了 ans = 1.000000000000000 + 3.000000000000000i 2.000000000000000 - 7.000000000000000i 5.000000000000000 + 4.000000000000000i >> v=(3:9)' v = 3 4 5 6 7 8 9 >> v([3 4]) ans = 5 6 >> v_col=(3:9)'%列向量 v_col = 3 4 5 6 7 8 9 >> v_row=(3:9)%行向量 v_row = 3 4 5 6 7 8 9 >> v_col([3:5]) ans = 5 6 7 >> v_row([3:5]) ans = 5 6 7
矩阵
>> M=[9 6 3;5 7 2] M = 9 6 3 5 7 2 >> rand(2)%两行两列随机矩阵 ans = 0.814723686393179 0.126986816293506 0.905791937075619 0.913375856139019 >> rand(2,3)%两行三列随机矩阵 ans = 0.632359246225410 0.278498218867048 0.957506835434298 0.097540404999410 0.546881519204984 0.964888535199277 >> randi([1,10])%1-10之间随机数 ans = 2 >> randi([1,10],3,4)%1-10之间随机3行4列随机矩阵 ans = 10 9 10 7 10 2 8 1 5 5 10 9 >> randi([1,10],[3,4])%1-10之间随机3行4列随机矩阵 ans = 10 8 2 3 7 4 8 1 8 7 1 1 >> zeros(3)%0矩阵 ans = 0 0 0 0 0 0 0 0 0 >> ones(3,5)%全1矩阵 ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 >> eye(4)%单位矩阵 ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 >> v v = 3 4 5 6 7 8 9 >> diag(v)%让对角线是v值的矩阵 ans = 3 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 9 >> diag([1 2 3 4])%对角线是1234的矩阵 ans = 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 4 >> diag(-1:-1:-6,-1)%让原对角线下面一行的一行数字-1到-6递减 ans = 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 -3 0 0 0 0 0 0 0 -4 0 0 0 0 0 0 0 -5 0 0 0 0 0 0 0 -6 0 >> diag(-1:-1:-6,-1)+diag(v)%加到原来的矩阵上 ans = 3 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 -2 5 0 0 0 0 0 0 -3 6 0 0 0 0 0 0 -4 7 0 0 0 0 0 0 -5 8 0 0 0 0 0 0 -6 9 >> diag(1:5)%对角线是1-5的矩阵 ans = 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 >> diag(1:4,1)%对角线上一行是1-4的矩阵 ans = 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 >> diag(1:5)+diag(1:4,1)+diag(2:5,-1)%对角线是1-5,对角线上一行是1-4,对角线下一行是2-5的矩阵 ans = 1 1 0 0 0 2 2 2 0 0 0 3 3 3 0 0 0 4 4 4 0 0 0 5 5 >> diag(1:5)+diag(1:4,1)+diag([2 4 6 8],-1)%对角线是1-5,对角线上一行是1-4,对角线下一行是指定的矩阵 ans = 1 1 0 0 0 2 2 2 0 0 0 4 3 3 0 0 0 6 4 4 0 0 0 8 5 >> M M = 9 6 3 5 7 2 >> M(2,3)%返回2行3列的数 ans = 2 >> M(2,[1 3])%返回第二行的第一个和第三个数 ans = 5 2 >> M(2,1:3)%返回第二行的1到3个数 ans = 5 7 2 >> M(2,:)%返回第二行所有数 ans = 5 7 2 >> M(:,2)%返回第二列所有数 ans = 6 7 >> M(end-1,:)%返回倒数第二行的所有数 ans = 9 6 3 >> M(2)%matlab标号有两种方式,第一种(1,1)(2,2);第二种123的标号是竖着标号的,对应数字956 ans = 5 >> M([6 3 5 4])%找第6354个数 ans = 2 6 3 7 >> M(2,3)=NaN%2行3列的数改成NaN M = 9 6 3 5 7 NaN >> M(1,:)=[1 2 3]%第一行所有数改成123 M = 1 2 3 5 7 NaN >> M(1:2,1:2)%拿出M的第一行的1-2和第二行的1-2个数 ans = 1 2 5 7 >> M(1:2,1:2)=[7 8;9 10]%M的第一行的1-2和第二行的1-2个数改成7 8 9 10 M = 7 8 3 9 10 NaN >> M(1,:)=0.5%第一行都改成0.5 M = 0.500000000000000 0.500000000000000 0.500000000000000 9.000000000000000 10.000000000000000 NaN >> M(1:2,1:2)=Inf%拿出M的第一行的1-2和第二行的1-2个数,改成正无穷 M = Inf Inf 0.500000000000000 Inf Inf NaN >> M(end,:)%选中M的最后一行 ans = Inf Inf NaN >> length(M)%返回行数或者列数中大的那个,max(2,3) ans = 3 >> size(M)%返回行数和列数 ans = 2 3 >> vector_size=size(M)%将右侧的数组赋予左侧的变量,变量是一个一行两列的向量 vector_size = 2 3 >> [n_row,n_col]=size(M)%将2和3分别给第一个和第二个变量 n_row = 2 n_col = 3 >> numel(M)%返回元素的个数 ans = 6 >> numel(v) ans = 7 >> zeros(size(M))%创建和M同样大小的0矩阵 ans = 0 0 0 0 0 0
4.3 向量和矩阵的常用函数
>> M=randi([1,10],[3,4])%1-10之间随机3行4列随机矩阵 M = 9 10 4 2 7 1 8 5 4 5 8 5 >> reshape(M,2,6)%改变M的形状,2行6列,即保留列的方式,9 7 4 10 1 5 4 8 8 2 5 5竖着排列 ans = 9 4 1 4 8 5 7 10 5 8 2 5 >> flipud(M)%向下翻转 ans = 4 5 8 5 7 1 8 5 9 10 4 2 >> fliplr(M)%左右翻转 ans = 2 4 10 9 5 8 1 7 5 8 5 4 >> flip(M)%对矩阵翻转,其实是对列向量进行翻转 ans = 4 5 8 5 7 1 8 5 9 10 4 2 >> rot90(M)%逆时针旋转90度 ans = 2 5 5 4 8 8 10 1 5 9 7 4 >> A=[1 2;3 4] A = 1 2 3 4 >> repmat(A,2,3)%将A矩阵复制2行3列,变成4行6列 repeat matrix ans = 1 2 1 2 1 2 3 4 3 4 3 4 1 2 1 2 1 2 3 4 3 4 3 4 >> repelem(A,2,3)%repeat element,将每个元素复制2行3列 ans = 1 1 1 2 2 2 1 1 1 2 2 2 3 3 3 4 4 4 3 3 3 4 4 4 >> size(A)%A维度2行2列 ans = 2 2 >> size(M)%M维度3行4列 ans = 3 4 >> E=[]%建立一个空矩阵,存储接下来每次循环的数值 E = [] >> E=[E,randi([1,6])] E = 4 >> E=[E,randi([1,6])] E = 4 5 >> E=[E,randi([1,6])] E = 4 5 5
4.4 向量运算和矩阵运算
>> T(:,:,1)=M %T的第一页是M的所有行和所有列 T = 3 2 9 3 7 2 4 7 6 5 6 3 >> T(:,:,2)=randi([1,9],[3,4]) %设置T的第二页是1-9之间3行4列的随机矩阵 T(:,:,1) = 3 2 9 3 7 2 4 7 6 5 6 3 T(:,:,2) = 5 9 2 3 7 5 3 8 9 2 8 3 %一直设置到T的第五页,则建立了一个三维的数组 >> T(:,:,5)=randi([1,9],[3,4]) T(:,:,1) = 3 2 9 3 7 2 4 7 6 5 6 3 T(:,:,2) = 5 9 2 3 7 5 3 8 9 2 8 3 T(:,:,3) = 9 3 4 5 4 6 8 9 2 5 6 3 T(:,:,4) = 7 6 5 2 7 1 8 6 4 1 9 5 T(:,:,5) = 1 8 2 6 4 3 6 7 2 5 3 7 >> size(T) %这时T的维度就是3行4列5页 ans = 3 4 5 >> whos Name Size Bytes Class Attributes T 3x4x5 480 double >> numel(T) %T的元素个数是60 ans = 60 >> v=randi([-5,5],[1,4]) %范围是-5到5的1行4列的矩阵 v = -1 -5 -3 5 >> abs(v) %对每个元素取绝对值 ans = 1 5 3 5 >> sign(v) %返回每个数字的符号 ans = -1 -1 -1 1 >> min(v) %最小值 ans = -5 >> max(v) %最大值 ans = 5 >> sum(v) %求和 ans = -4 >> prod(v) %求积 ans = -75 >> cumsum(v) %cumulative sum逐渐扩大求和的范围。-1是第一个元素的和,-6是前两个元素的和,-9是前三个元素的和,-4是前四个元素的和 ans = -1 -6 -9 -4 >> cumprod(v) %cumulative product逐渐扩大求积的范围。-1是第一个元素,5是前两个元素的积,-15是前三个元素的积,-75是前四个元素的积 ans = -1 5 -15 -75 >> cummax(v) %cumulative maximum依次计算前几个元素的最大值 ans = -1 -1 -1 5 >> M M = 3 2 9 3 7 2 4 7 6 5 6 3 >> min(M) %对每一列求最小值 ans = 3 2 4 3 >> max(M) %对每一列求最大值 ans = 7 5 9 7 >> diff([1 4 7 8 3]) %different求前后元素的差值 ans = 3 3 1 -5 >> [1 4 7 8 3]*3%矩阵和标量的运算 ans = 3 12 21 24 9 >> [1 4 7 8 3]+1 ans = 2 5 8 9 4 四则运算见第一天的矩阵操作
4.5 逻辑向量和逻辑矩阵
>> v=rand(1,5) v = 0.4427 0.1067 0.9619 0.0046 0.7749 >> v>0.5 %返回逻辑矩阵,比较每个数字和0.5的大小 ans = 1×5 logical 数组 0 0 1 0 1 >> u=v>0.5 %将逻辑值赋给u u = 1×5 logical 数组 0 0 1 0 1 >> v(u) %返回逻辑值是1时对应的v中的值 ans = 0.9619 0.7749 >> v(v>0.5) %返回v中所有大于0.5的数字 ans = 0.9619 0.7749 >> vec=[5 9 3 4 6 11] %赋值 vec = 5 9 3 4 6 11 >> v=logical([0 1 0 0 1 1]) %将默认的double类型的数组转化成逻辑型的数组 v = 1×6 logical 数组 0 1 0 0 1 1 >> vec(v) %返回逻辑值是1时对应的vec中的值 ans = 9 6 11 >> log_true=ones(3,4,'logical') %3行4列的1矩阵转换成逻辑型 log_true = 3×4 logical 数组 1 1 1 1 1 1 1 1 1 1 1 1 >> v=logical([0 1 0 0 1 1]) %将默认的double类型的数组转化成逻辑型的数组 v = 1×6 logical 数组 0 1 0 0 1 1 >> any(v) %v中有一个为真,逻辑结果就是1 ans = logical 1 >> all(v) %v中所有的都是真,结果才是1,否则是0 ans = logical 0 >> R=rand(50,50) %产生50*50的随机矩阵 >> any(R<0.001) %R<0.001产生50*50的逻辑矩阵, ans = 1×50 logical 数组 1 至 22 列 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 23 至 44 列 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 45 至 50 列 0 0 0 1 0 0 >> R=rand(1,10) R = 1 至 8 列 0.8558 0.6708 0.5236 0.2988 0.7040 0.3816 0.5677 0.8879 9 至 10 列 0.8429 0.8988 >> v=R>0.5 v = 1×10 logical 数组 1 1 1 0 1 0 1 1 1 1 >> find(v) %选择出逻辑值是1对应的位置 ans = 1 2 3 5 7 8 9 10 >> min(find(v)) %找出第一次真值出现的位置 ans = 1 >> find(v,1,'first') %找出第一次真值出现的位置 ans = 1 >> find(v,2,'first') %找出前两次真值出现的位置 ans = 1 2 >> v1=[1 2 3 4] v1 = 1 2 3 4 >> v2=[1 2 3 4] v2 = 1 2 3 4 >> v1==v2 ans = 1×4 logical 数组 1 1 1 1 >> all(v1==v2) ans = logical 1 >> isequal(v1,v2) ans = logical 1 >> vec=[11 -5 33 2 8 -4 25] vec = 11 -5 33 2 8 -4 25 >> find(vec<0) %找出小于0的位置 ans = 2 6 >> vec(find(vec<0))=[] %删掉小于0的位置对应的数 vec = 11 33 2 8 25 >> vec(vec<0)=[] %得到同样的结果 vec = 11 33 2 8 25 >> rng(0) %重新设置随机生成器,逻辑种子成为0 >> V=randi([0,1],[1,1000]); %生成行数是1列数是1000的 0和1的整数 数组 %关心什么时候0后面接着一个1,1后面接着一个0,要对数字进行减法。以前十个整数为例,计算后一个和前一个的差 >> V(1:10) ans = 1 1 0 1 1 0 0 1 1 1 >> diff(V(1:10)) %9个数字 ans = 0 -1 1 0 -1 0 1 0 0 >> find(diff(V(1:10))==-1) %找出值是-1的位置,是原来10个数组中第2个和第5个1后面接着一个0 ans = 2 5 >> find(diff(V(1:10))==1) %找出值是1的位置,是原来10个数组中第3个和第7个0后面接着一个1 ans = 3 7 >> size(diff(V)==1) %diff(V)是1000个数字与前一个数字做减法,结果会有999个数字。diff(V)==1做逻辑判断,会有999个数字。用size求数组的行和列的值,是1行999列 ans = 1 999 >> numel(diff(V)==1) %共999个数 ans = 999 >> sum(diff(V)==1) %0后面接着一个1 这个事件发生了多少次 ans = 243 >> U=randi([0,2],[1,1000]); %生成行数是1列数是1000的 0到2的整数 数组 %关心什么时候1后面接着一个2,以前十个整数为例 >> U(1:10) ans = 1 1 2 0 1 1 1 0 0 1 >> V1=U(1:end-1); %以前十个数字为例,即V1=[1 1 2 0 1 1 1 0 0] >> V2=U(2:end); %以前十个数字为例,即V2=[1 2 0 1 1 1 0 0 1] >> sum(V1==1 & V2==2) % V1=1 且 V2=2时的位置算是逻辑值1,求和。另外,向量的 且 是& ans = 119
4.6 矩阵乘法+变量的输出和显示
4.6.1 矩阵乘法
>> N1=randi([1,9],[3,4]) %范围是1到9,3行4列的整数矩阵 N1 = 7 2 3 6 9 3 9 2 3 4 1 8 >> N2=randi([1,9],[4,3]) %范围是1到9,4行3列的整数矩阵 N2 = 2 1 3 5 2 9 9 4 7 4 4 9 >> N1*N2 ans = 75 47 114 122 59 135 67 47 124 >> N0=randi([1,9],[4,4]) N0 = 4 8 8 3 9 3 6 3 1 9 8 6 6 7 3 8 >> N0*N0 ans = 114 149 153 108 87 156 147 96 129 149 144 126 138 152 138 121 >> N0^2 ans = 114 149 153 108 87 156 147 96 129 149 144 126 138 152 138 121 >> N0.^2 %对于数字的2次方 ans = 16 64 64 9 81 9 36 9 1 81 64 36 36 49 9 64 >> V1=randi([1,9],[1,3]) V1 = 8 4 4 >> V2=randi([1,9],[1,3]) V2 = 6 7 7 >> V1.*V2 %点乘是对应位置相乘 ans = 48 28 28 >> %V1=[a1,b1,c1] V2=[a2,b2,c2] 内积是 a1*a2+b1*b2+c1*c2 >> sum(V1.*V2) ans = 104 >> V1*V2' %求内积,转置的优先级比乘法高 ans = 104 >> cross(V1,V2) %差积 ans = 0 -32 32
4.6.2 常用矩阵
>> hilb(3) ans = 1.0000 0.5000 0.3333 0.5000 0.3333 0.2500 0.3333 0.2500 0.2000 >> hilb(5) ans = 1.0000 0.5000 0.3333 0.2500 0.2000 0.5000 0.3333 0.2500 0.2000 0.1667 0.3333 0.2500 0.2000 0.1667 0.1429 0.2500 0.2000 0.1667 0.1429 0.1250 0.2000 0.1667 0.1429 0.1250 0.1111 >> pascal(5) ans = 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70 >> magic(4) ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
>> M=randi([1,9],[4,4]) M = 4 3 3 9 8 5 5 2 2 8 4 3 6 2 8 7 >> find(M==2) %找到M中元素是2对应的线性位置 ans = 3 8 14 >> [I,J]=ind2sub(size(M),find(M==2)) %将线性位置转化成(3,1)(4,2)(2,4)存储在IJ中,这里面,ind2sub是函数,size(M)是固定的 矩阵的大小 I = 3 4 2 J = 1 2 4
选中行数 ctrl+R是注释,ctrl+Z是撤销
4.6.3 第一个编码,求圆面积
radius=5; %半径是5 area=pi*radius^2; %求面积 %第一种方法 disp(['the area of the disc is ' num2str(area)]); %输出 %运行,输出结果是 >> test the area of the disc is 78.5398 %第二种方法 fprintf(['the area of the disc is %f \n',area]); %将后面的第一个数以浮点数输出放在%f的位置 \n另起一行,运行,输出结果是 >> test the area of the disc is 78.539816 %若%f换成%d,则是以科学计数法的形式显示出来
>> num2str(pi,3) %保留3位有效数字 ans = '3.14' >> num2str(pi) %通常情况下有5位数字 ans = '3.1416' >> num2str(area,8) %保留8位有效数字 ans = '78.539816'
>> char(area) ans = 'N' >> syms area >> char(area) ans = 'area'
>> A=eye(3) A = 1 0 0 0 1 0 0 0 1 >> A=eye(3)/3 A = 0.3333 0 0 0 0.3333 0 0 0 0.3333 >> A*inv(A) %inv(A)是A的逆 ans = 1 0 0 0 1 0 0 0 1 >> inv(A) ans = 3 0 0 0 3 0 0 0 3 >> B=eye(3)*3 B = 3 0 0 0 3 0 0 0 3 >> A\B %等于inv(A)*B 即A的逆乘以B ans = 9 0 0 0 9 0 0 0 9 >> A/B %等于A*inv(B) 即A乘以B的逆 ans = 0.1111 0 0 0 0.1111 0 0 0 0.1111