MATLAB矩阵的建立与访问
参考博客:
https://blog.csdn.net/kebu12345678/article/details/80949367
https://blog.csdn.net/cnds123/article/details/99645919
数值数据的输出格式(format)
format命令的格式: format 格式符
注意:format命令只影响数据输出格式 ,而不影响数据的计算和存储。
>> format long
>>> 50/3
ans = 16.666666666666668
>> format
>>> 50/3
ans =
16.6667
一、 MATLAB 函数的调用格式
(1)函数的调用格式为:
函数名(函数自变量的值)
函数在运算时是将函数逐项作用于矩阵 的每个元素上,所以最后运算的结果就 是一个与自变量同型的矩阵。
标量是矩阵的特例
>> A=[4,2;3,6] A = 4 2 3 6 >> B=exp(A) B = 54.5982 7.3891 20.0855 403.4288
常用函数的应用
① 三角函数有以弧度为单位的函数和以角度为单位的函数,如果是以 角度为单位的函数就在函数名后面加“d”,以示区别。
>> sin(pi/2) ans = 1 >> sind(90) ans = 1
② abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值。
>> abs(-4) ans = 4 >> abs(3+4i) ans = 5 >> abs('a') ans = 97
③用于取整的函数有fix、floor、ceil、round。
>> round(4.7) ans = 5 >> fix(-3.2) ans = -3 >> floor(3.6) ans = 3 >> ceil(-3.8) ans = -3
round 函数是按照四舍五入的规则来取整。
ceil 是向上取整,取大于等于这个数的第一个整数。
floor 是向下取整,取小于等于这个数的第一个整数。 (floor 天花板)
fix 是固定取靠近0的那个整数,也就是舍去小数取整。
二、MATLAB矩阵表示及矩阵元素的引用
(1) 利用直接输入法建立矩阵
将矩阵的元素用中括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用逗号或空格分隔,不同行的元素之间用分号分隔。
>> A=[1,2,3;4,5,6;7,8,9]
A =
1 2 3
4 5 6
7 8 9
(2) 利用已建好的矩阵建立更大的矩阵
一个大矩阵可以由已经建立好的小矩阵拼接而成
>> A=[1,2,3;4,5,6;7,8,9];
>> B=[-1,-2,-3;-4,-5,-6;-7,-8,-9];
>> C=[A,B;B,A]
C = 1 2 3 -1 -2 -3
4 5 6 -4 -5 -6
7 8 9 -7 -8 -9
-1 -2 -3 1 2 3
-4 -5 -6 4 5 6
-7 -8 -9 7 8 9
(3) 用实部矩阵和虚部矩阵构成复数矩阵
>>B=[1,2,3;4,5,6];
>>C=[6,7,8;9,10,11];
>>A=B+i*C
A =
1.0000 + 6.0000i 2.0000 + 7.0000i 3.0000 + 8.0000i
4.0000 + 9.0000i 5.0000 +10.0000i 6.0000 +11.0000i
(4) 冒号表达式
冒号表达式:
起始:[步长:]终止
生成行向量,省略步长,则默认为1
等价于linspace (a,b,n) 函数,此matlab函数返回a与b之间均匀间隔点的n个元素的行向量,当n省略时,生成100个。
阅读文献时请注意:矩阵中行列的意思,大陆将水平(横)的称行,垂直(竖)的称列,但台湾的行和列与大陆恰好相反。即大陆把 row 叫行,把 column 叫列,台湾把 row 叫列,把 column 叫行,跟我们大陆正好相反。
符号矩阵的生成
- sym函数
sym函数用于建立单个符号对象,其常用调用格式为:
符号对象名=sym(A)
将由A来建立符号对象。其中,A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),此时符号对象为一个符号常量;A也可以是一个变量名(加单引号),这时符号对象为一个符号变量。
>>sin(sym(pi/3))
>>ans =
3^(1/2)/2
符号计算的结果是一个精确的数学表达式, 也可以是一个数值。
三、matlab中引用元素方法:
①下标。
②索引序号 他们之间的关系A(i,j)的序号为(j-1)×m+i
③布尔(逻辑)法。
矩阵访问一律用(),元胞数组用{}
a(i,j) %第i行第j列队元素
a(:,j) %第j列的所有元素
a(2:end,j) %第j列中第2行到最后一行的元素
a(:,3:5) %第3〜5列的所有元素
a(x) %第x个元素(x为从最左边第1列开始编号,若a为4行5列,则a(10)==a(2,3))
下标法
矩阵同一行元素可用逗号或空格分隔。
【注】(1)matlab中元素中下标的序号是从一开始的;
(2)matlab中元素按列存储,依次第一列,第二列等。Matlab的存储顺序是8,3,4,1,5,9,6,7,2,如下图所示:
★下标法引用的例子
A(i,j):其中 i 和 j 可以是一维向量、标量、“:”号 或者 “end”,示例如下:
A(2:3,3👎1)表示引用数组中的2~ 3行,3~1列对应的元素
>>A(2:3,3:-1:1)
ans =
7 5 3
2 9 4
A(:,end)表示引用最后一列元素,“:”表示所有列或行,“end”表示最后一列或列,“end-n”表示倒数第n行或列
>>A(:,end)
ans =
6
7
2
A(1,end-1)表示引用第1行倒数第2个元素
>>A(1,end-1)
ans =
1
A(:,[2,3])表示引用第 2、3 列元素
>> A(:,[2,3])
ans =
1 6
5 7
9 2
索引法
A(index):index可以是任意的数组(可以是一维或者二维),index的元素必须是正整数。
ind2sub 和 sub2ind 函数
ind2sub函数
ind2sub和sub2ind这对函数,是互逆的一对函数。ind2sub把数组或者矩阵的线性索引转化为相应的下标;sub2ind则正好相反,将下标转化为线性索引。
下标和索引之间可以通过 ind2sub 和 sub2ind 函数相互转换,具体可以看帮助(在命令行窗口中输入 help 函数名 按下回车键)
[I,J] = ind2sub(siz,IND)
IND = sub2ind(siz,I,J)
二维矩阵: IND = sub2ind(SIZ,I,J)
SIZ是转换矩阵的大小,一般用size函数求得;
I是下标中的行数,J是下标中的列数;
返回值IND是转化后对应的序列号(索引号);
还有使用A(:)就可以将数组A转换为列向量
The ind2sub function determines the equivalent subscript values corresponding to a single index into an array
A(😃 将数组A转换为列向量
A(8):表示引用A的第8个元素
>>A(8)
ans =
7
B=A([1 5 2 2 1 3]):表示依次引用A的第1,5,2,2,1,3个元素,返回与index尺寸相同的数组,也就是说size(B)=size(index)
>>B=A([1 5 2 2 1 3])
B =
8 5 3 3 8 4
A([2 7 9;1 1 1;8 7 6]):返回的时侯是一个3*3的矩阵
>>A([2 7 9;1 1 1;8 7 6])
ans =
3 6 2
8 8 8
7 6 9
布尔法引用
A(X):X是一个有0和1组成布尔型数据,且size(A)=size(X),对应位置为1则留下该数据,0则去掉,最后按A中的存储顺序,返回一个列向量
假如说A是3*3的数组
A(logical([1 0 0;0 1 0;0 0 1])):表示引用了数组A的对角线元素,注意必须使用logical将0/1数组转换为布尔型
A(x)%引用对应位置为1的数据,返回列向量
x=logical([1 1 0;0 1 1;1 0 1])%将double转化为boolean型数据
x =
3×3 logical 数组
1 1 0
0 1 1
1 0 1
A(x)%引用对应位置为1的数据,返回列向量
ans =
8
4
1
5
7
2
如果想要写一段小程序,只需要在每一句话的后面加一个英文分号,再回车即可。如实现两个二维矩阵相加的小程序a+b。
a=[5 6;7 8];
b=[1 2;3 4];
c=a+b;
disp©
6 8
10 12
利用空矩阵删除矩阵的元素
>> A=[1,2,3,0,0;7,0,9,2,6;1,4,-1,1,8]
A =
1 2 3 0 0
7 0 9 2 6
1 4 -1 1 8
>> A(:,[2,4])=[]
A =
1 3 0
7 9 6
1 -1 8
改变矩阵的形状
reshape(A,m,n):在矩阵总元素保持不变的前提下,将矩阵A重 新排成m×n的二维矩阵。
注意:reshape函数只是改变原矩阵的行数和列数,但并不改变原矩阵元素个数及其存储顺序。
>> x=[23,45,65,34,65,34,98,45,78,65,43,76];
>> y=reshape(x,3,4)
y =
23 34 98 65
45 65 45 43
65 34 78 76
A(😃 :将矩阵A的每一列元素堆叠起来,成为一个列向量。
A =[-45,65,71;27,35,91] A = -45 65 71 27 35 91 >> B=A(😃 B = -45 27 65 35 71 91
A(:)等价于reshape(A,6,1)。
四、创建数组,添加元素
A=[];
A(1)=2;
A(2)=3;
A(3)=7;
添加列向量
A = [1 2; 3 4; 5 10]
A = [A [7;8;9]]
1 2 7
3 4 8
5 10 9
A = [1 2; 3 4; 5 10]
A = [A [7;8;9]]
B = [1,2,3;4,5,6;7,8,9]
C = [A B]
1 2 7 1 2 3
3 4 8 4 5 6
5 10 9 7 8 9
A = [1 2; 3 4; 5 10]
A = [A [7;8;9]]
disp(A)
B = [1,2,3;4,5,6;7,8,9]
C = [A B]
D = [A;B]
D =
1 2 7
3 4 8
5 10 9
1 2 3
4 5 6
7 8 9
五、创建三维数组的三种方法
(1) 使用下标创建三维数组
for i=1:2
for j=1:2
for k=1:3
A(i,j,k)=i+j+k;
end
end
end
disp(A)
输出为:
(:,:,1) =
3 4
4 5
(:,:,2) =
4 5
5 6
(:,:,3) =
5 6
6 7
(2) 使用低维数组创建三维数组
可以先创建一个二维数组,然后再通过第三维数组与其关系生成第三维数组;
D2=[1,2,3;4,5,6;7,8,9];
D3(:,:,1)=D2;
D3(:,:,2)=2*D2;
D3(:,:,3)=3*D2;
disp(D3)
输出为:
(:,:,1) =
1 2 3
4 5 6
7 8 9
(:,:,2) =
2 4 6
8 10 12
14 16 18
(:,:,3) =
3 6 9
12 15 18
21 24 27
(3) 使用创建函数创建三维数组
使用 cat 命令来创建高维数组。
cat命令:
C = cat(dim,A1,A2,A3,A4…)
其中dim表示的是创建数组的维度,A1,A2,A3,A4表示的是各维度上的数组。
D2=[1,2,3;4,5,6;7,8,9];
C=cat(3,D2,2*D2,3*D2);
disp(C)
输出为:
(:,:,1) =
1 2 3
4 5 6
7 8 9
(:,:,2) =
2 4 6
8 10 12
14 16 18
(:,:,3) =
3 6 9
12 15 18
21 24 27
特殊矩阵
通用性的特殊矩阵
用于专门学科的特殊矩阵
1.通用的特殊矩阵
zeros函数:产生全0矩阵,即零矩阵。
ones函数:产生全1矩阵,即幺矩阵。
eye函数:产生对角线为1的矩阵。当矩阵是方阵时,得到一个单位矩阵。
rand函数:产生(0,1)区间均匀分布的随机矩阵。
randn函数:产生均值为0,方差为1的标准正态分布随机矩阵。
zeros函数的调用格式:
zeros(m):产生m×m零矩阵。
zeros(m,n):产生m×n零矩阵。
zeros(size(A)):产生与矩阵A同样大小的零矩阵。
>> A=zeros(2,3)
A =
0 0 0
0 0 0
>> zeros(size(reshape(A,3,2)))
ans =
0 0
0 0
0 0
例1 首先产生5阶两位随机整数矩阵A,再产生均值为0.6、方差为0.1的5阶
正态分布随机矩阵B,最后验证(A+B)I=IA+BI(I为单位矩阵)。
rand函数:产生(0,1)开区间均匀分布的随机数x。
fix(a+(b-a+1)*x):产生[a,b]区间上均匀分布的随机整数。
randn函数:产生均值为0、方差为1的标准正态分布随机数x。
μ+σx:得到均值为μ、方差为σ2的随机数
size函数
A = [1 2; 3 4; 5 10]
a = size(A)
b = size(a)
disp(A)
disp(a)
disp(b)
A =
1 2
3 4
5 10
a =
3 2
b =
1 2
注:size() 函数返回值为矩阵
A = [1 2; 3 4; 5 10]
size(A,1)
size(A,2)
1 表示行数; 2表示列数
如果是向量使用 length
v=[1 23 46 6]
length(v)
length(A)
返回最大维度;最好对向量使用
pwd
显示当前路径
ls
显示当前路径下文件
cd 路径名
mat 文件为二进制文件, 存储空间小
w = randn(1,10000);
hist(w,50)
参考博客:
https://blog.csdn.net/cnds123/article/details/99645919