MATLAB学习笔记------第二章
结构体
创建
matlab
% 第一种形式创建(单独指定)
S = struct();
S.name = '乔峰';
S.score = 95;
S.grade = 'A+';
S(2).name = '虚竹';
S(2).score = 80;
S(2).grade = 'B';
% 第二种形式创建(直接指定)
S(3) = struct('name','段誉','score',70,'grade','C');
结构体数组的引入
matlab
S; % 输出结构体的内容
elem1 = S(1); % 索引,输出第一个结构体的元素
elemname = S(2).name; % 输出第二个元素的name值
scores = [S.score]; % 取出结构体的元素值,构成数组,进行运算
sm = mean(scores);
元胞数组
创建
matlab
C0 = {1,2,3;
'text',rand(5,10,2),{11; 22; 33}};
C1 = cell(3);
C2 = cell(3,4,2);
对元胞数组应用函数
使用celllfun函数,把对应的函数名用@符号引用后,作为第一个参数变量
matlab
C = {1:10, [2; 4; 6], []};
A = cellfun(@mean,C);
返回多项数组
matlab
X = {5:5:100, 10:10:100, 20:20:100};
Y = {rand(1,20), rand(1,10), rand(1,5)}; % 不同长度的数组
figure
hold on
p = cellfun(@plot,X,Y); % 引用plot函数画图
p(1).Marker = 'o';
p(2).Marker = '+';
p(3).Marker = 's';
hold off
显示元胞数组的内容
matlab
% 数值的方式显示内容
Result = celldisp(C);
% 以图形方式显示元胞数组的内容
c{1,1} = '2-by-2';
c{1,2} = 'eigenvalues of eye(2)';
c{2,1} = eye(2);
c{2,2} = eig(eye(2));
cellplot(c) % 以图形的方式显示元胞数组的内容,不一定要求内容是数值
示例
matlab
x=0:pi/100:2*pi;
% 四条曲线
y(1,:)=x.*sin(x);
y(2,:)=x.^2-4*x-4;
y(3,:)=x.*cos(x);
y(4,:)=x.*log(x);
colors = {'r','b','g','m'}; % 颜色元胞数组
linestype = {'-','--',':','-.'}; % 线形元胞数组
led = {'x.*sin(x)','x.^2-4*x-4','x.*cos(x)','x.*log(x)'}; % 图例元胞数组
for i=1:4
plot(x,y(i,:),strcat(colors{i},linestype{i}),'LineWidth',2);
hold on
end
legend(led,'Location','best')
grid on
hold off
矩阵操作
创建
matlab
% 利用函数创建矩阵
A_zeros = zeros(3,2); % 零矩阵
A_ones = ones(3,2); % 全1矩阵
A_eyes = eye(3,3); % 单位矩阵
A_rand = rand(3,2); % 0-1之间的随机数组
A_randn = randn(3,2); % 均值0,方差1的正态分布随机数
V_A = diag(A_rand); % 返回矩阵对角线上的元素
A_magic = magic(3); % 填充1-3^2之间的数组,行,列,对角线加起来等于相同的数
% 希尔伯特矩阵
H = hilb(4);
Hv = invhilb(4); % 逆变换
% 范德蒙矩阵
d = [1,2,3,4,5];
V = vander(d);
% 稀疏距阵
i=[1 3 1 2 1 4];
j = [1 1 2 2 3 4];
s = [1 2 3 4 5 6];
S2 = sparse(i,j,s,10,10);
S3 = full(S2); % 显示矩阵形式
数组的操作方法
matlab
% 数组的寻址
A = magic(5);
ind = [3 8 6 7 10 15 17 25]; % 索引位置
subA = A(ind);
k = logical([1 0 1 0 0 1 0 0 1 0 1]); % 逻辑向量:0表示不取值,1表示取值
subA2 = A(k);
% 数组的连接与翻转
B = round(randn(5));
% 竖向拼接
C = [A;B];
cat(1,A,B);
vertcat(A,B);
% 横向拼接
D = [A,B];
cat(2,A,B);
horzcat(A,B);
rot90(A); % 将矩阵逆时针旋转90°
fliplr(A); % 将矩阵左右翻转
flipud(A); % 将矩阵沿水平轴翻转
% 去除重复元素与排序unique
E = unique(B); % 按从小到大,返回B矩阵中无重复元素
F = unique(B,"rows"); % 去除B中的重复行
[Y,l] = sort(B,1,"ascend"); % 详情查找sort函数的帮助文档
% 子数组搜索
ind = find(B); % 查找非0元素,并返回索引值
ind2 = find(B,3,'first'); % 返回前3个不为0的索引值
ind3 = find(B,3,'last'); % 返回后3个不为0的索引值
[row,col] = find(B,3,"first"); % 返回行和列的索引值
向量的处理
matlab
% 向量的创建
y = linspace(1+2i,10+10i,8);
y1 = linspace(3,5,7); % 生成从3到5,7个等间距的点,等差数列
% 判断向量共面或共线
% 当3个向量线性相关时,则这三个向量组成的矩阵的秩小于3,并且3个向量共面
x = [1,1,1];
y = [-1,2,1];
z = [2,2,2];
A = [x;y;z]; % 组成一个矩阵,方便求秩
r = rank(A); % 求矩阵的秩
matlab
% 向量的方向余弦
v = rand(1,3);
u = randn(1,3);
costheta = (u-v)/norm(u-v); % 方向余弦,norm函数求向量的模
% 向量内积(点乘)
A = [4 -1 2];
B = [2 -2 -1];
C = dot(A,B);
% 向量夹角(先求夹角余弦,在用反余弦函数求夹角)
x = randn(1,8);
y = rand(1,8);
r1 = norm(x); % norm函数求向量的模
r2 = norm(y); % 求模
costheta = dot(x,y)/(r1*r2); % 利用定义求夹角余弦值
theta = acos(costheta)*180/pi; % 反函数求夹角,转为角度制
% 向量的叉乘(叉积,向量积)
A = [4 -2 1]; % 只能是三维
B = [1 -1 3];
C = cross(A,B); % cross函数:求叉积
dot(C,A)==0 & dot(C,B)==0; % 检验是否和两个向量都点乘为0
matlab
% 点到直线的距离
D = [1,2,3];
V = [5.8,-4.5,3.9];
% norm(v,p):计算向量V的p范数
r = abs(dot(D,V)-1.78)/norm(V,2);
矩阵处理
matlab
% 矩阵的逆
X = [1 0 2; -1 5 0; 0 3 -9];
Y = inv(X); % inv:求逆矩阵
% 方阵的行列式
det(X);
% 矩阵的秩
rank(X);
matlab
% 范数
norm(X,1); % 1-范数
norm(X,2); % 2-范数
norm(X); % 默认为2-范数
norm(X,"inf"); % 无穷范数
% 矩阵的条件数
% 条件数等于A的范数与A的逆矩阵的范数的乘积,值越接近于1越好
cond(X);
% 矩阵的迹
% 等于对角线元素之和,矩阵的特征值之和
trace(X);
% 特征值和特征向量
e = eig(X); % 特征值
[V,D] = eig(X); % D表示特征值矩阵
% 正交基
Q = orth(X);
% 正定矩阵的判定
[D,p] = chol(X); % p=0 说明是正定矩阵
% 零空间标准正交基
N = null(ones(3,3));
矩阵方程的求解
matlab
A = round(5*randn(5));
b = round(5*randn(5,1));
[x,y] = leqsolve(A,b); % 调用函数
rank(A) == rank([A,b]); % 验证
函数leqsolve
matlab
function [x,y] = leqsolve(A,b)
%% 求解线性方程组的解,输入参数:A系数距阵,b是右端向量;输出参数:x是唯一解或者特解,y是基础解
if nargin < 2 % nargin表示输入参数的个数
disp('请输入系数矩阵A和右端向量b!')
return
end
y = []; % 基础解系
[m,n] = size(A); % 系数矩阵维度的长度
if norm(b) > 0 % 非齐次方程
if rank(A) == rank([A,b]) % 方程组相容,有解
if rank(A) == n % 唯一解
disp('方程组有唯一解')
x = A\b;
else % 方程有无穷多个解,基础解系
disp('方程组有无穷多个解,其齐次方程组的基础解系是y,特解是x:')
x = A\b; % 特解
y = null(A,'r'); % 基础解系
end
else % 方程组不相容,给出最小二乘解
disp('方程组的最小二乘解是:')
x = A\b;
end
else % 齐次方程
if rank(A) >= n % 列满秩
x = zeros(m,1); % 零解
else % 非零解
disp('方程组有无穷多个解,基础解系x是:')
x = null(A,'r');
end
end
end