MATLAB学习笔记——第二章

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
相关推荐
Titan20241 小时前
C++异常学习笔记
c++·笔记·学习
小陈phd2 小时前
多模态大模型学习笔记(五)—— 神经网络激活函数完整指南
人工智能·笔记·神经网络·学习·自然语言处理
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [drivers]char
linux·笔记·学习
码喽7号2 小时前
springboot学习一:环境配置与基本入手
学习
深蓝海拓3 小时前
PySide6的QTimeLine详解
笔记·python·qt·学习·pyqt
GHL2842710903 小时前
TensorFlow学习
人工智能·学习
星火开发设计3 小时前
虚析构函数:解决子类对象的内存泄漏
java·开发语言·前端·c++·学习·算法·知识
2501_901147833 小时前
幂函数实现的优化与工程思考笔记
笔记·算法·面试·职场和发展·php
t198751283 小时前
MATLAB水声信道建模:方法、实现与应用
开发语言·matlab