Matlab操作

    技术2025-07-23  9

    目 录

    基本操作输出矩阵创建矩阵矩阵分析矩阵运算矩阵操作排序与插值多项式计算函数极值无约束问题 数据处理读取数据数据处理控制语句数据保存 绘图

    基本操作

    输出

    显示变量值:

    直接打变量名,不加分号disp()函数,但disp()函数输出变量类型固定,如果同时输出数字和字符串需要用到num2str()函数,将数值型转化成字符型。 例如: x=1000; str='Hello world!'; disp([str,num2str(x)])

    显示结果:Hello world!1000

    带格式输出:

    生成带格式字符:sprintf(format, data) 直接生成带格式的字符串的

    输入:

    %数值的格式化输出 str_a=sprintf('%.5f',pi); %字符串的格式化输出 str=sprintf('pi = %.5f',pi); %输出类型为char str1=sprintf(string('pi = %.5f'),pi); %输出类型为string team1='Manchester United'; team2='Chelsea'; str2=sprintf('%s won %s,congratulations',team1,team2);

    输出:

    str_a = 3.14159 str = pi = 3.14159 str1 = string "pi = 3.14159" str2 = Manchester United won Chelsea,congratulations

    %c 单个字符 %d 有符号十进制数(%i也可以) %u 无符号十进制数 %f 浮点数(%8.4f表示对浮点数取8位宽度,同时4位小数) %o 无符号八进制数 %s 字符串 %x 小写a-f的十六进制数 %X 大小a-f的十六进制数

    将带格式字符输出到文件:fprintf(fid, format, data) 其中fid表示由fopen函数打开的文件句柄,如果fid省略,则直接输出在屏幕上 例如: data = [5, 1, 2; 3, 7, 4]; [row, col] = size(data); %求出矩阵data的行数和列数 %加t表示按Windows格式输出换行,即0xOD 0x0A,没有t表示按Linux格式输出换行,即0x0A fid=fopen('test.txt', 'wt'); %打开文件 for i=1:row for j=1:col fprintf(fid, '%d ', data(i, j)); %类似于C语言的输出格式 end fprintf(fid, '\n'); end fprintf(fid, 'This is a string\n'); fprintf(fid, '%X', hex2dec('ABCD')); fclose(fid); %最后不要忘记关闭文件!

    矩阵

    创建矩阵

    创建m×n矩阵:

    A = [a11 a12 a13 …… a1n;a21 a22 a23 …… a2n; …… ;am1 am2 am3 …… amn];

    A = [a11,a12,a13,……,a1n;a21,a22,a23,……,a2n; …… ;am1,am2,am3,……,amn];

    创建m×n元素全为1的矩阵:

    A = ones(m,n);

    创建m×n元素全为0的矩阵:

    A = zeros(m,n);

    创建m×n元素服从0-1均匀分布的矩阵:

    A = rand(m,n);

    创建m×n元素服从高斯分布的矩阵:

    A = randn(m,n);

    创建n×n的单位矩阵:

    I = eye(n);

    创建n阶幻方:

    magic(n); %每行、每列、对角线之和都相等

    创建等差数列向量:

    v = [起始值:间隔值:终止值]; v = linspace(起始值,间隔值,取值个数);

    创建稀疏矩阵:

    sparse(u,v,S); %其中u,v,S是3个等长的向量。S是要建立的稀疏存储矩阵的非零元素,u(i)、v(i)分别是S(i)的行和列下标 B = spconvert(A); %A为m×3或m×4的矩阵 [B,d]=spdiags(A); %从带状稀疏矩阵A中提取全部非零对角线元素构成矩阵B及其这些非零对角线的位置向量d。 A=spdiags(B,d,m,n); %产生带状稀疏矩阵的稀疏存储矩阵A,其中m、n为原带状稀疏矩阵的行数与列数,矩阵B的第i列即为原带状稀疏矩阵的第i条非零对角线,向量d为原带状稀疏矩阵所有非零对角线的位置 speye(m,n); %返回一个m*n的稀疏存储单位矩阵

    创建网格

    [X,Y]=meshgrid(xgv,ygv); %% meshgrid函数生成的X,Y是大小相等的矩阵,xgv,ygv是两个网格矢量,xgv,ygv都是行向量。 X:通过将xgv复制length(ygv)行(严格意义上是length(ygv)-1行)得到 Y:首先对ygv进行转置得到ygv',将ygv'复制(length(xgv)-1)次得到。 %% [X,Y]=meshgrid(gv); %就相当于[X,Y]=meshgrid(gv,gv)

    矩阵分析

    获取矩阵维度

    a = size(A); %a为1×2的向量,第一个元素是矩阵维数,第二个元素是矩阵列数 [m,n] = size(A); %m是矩阵维数,n是矩阵列数 m = size(A,1); %获取A的行数 n = size(A,2); %获取A的列数 rank(A); %获取矩阵的秩

    获取向量长度

    l = length(v); %l为v向量的个数,v如果为矩阵则返回max{m,n}

    获取A矩阵中的数据

    a_ij = A(i,j); %获取第i行,第j列的元素 a_i = A(i,:); %获取第i行的向量 a_j = A(:,j); %获取第j列的向量 R_25 = A(2:5,:); %获取第23行数据的矩阵 R_13 = A([1:3],:); %获取第1行和第3行数据的矩阵 B = A'; %获得A的转置矩阵 v = A(:); %将A的所有列按顺序组合成一个列向量

    写入矩阵

    A(i,j) = x; %令A的第i行第j列的元素为x A(i,:) = a_i; %令A第i行的向量为a_i A = [A,a_n+1]; %新写入一列,a_n+1=[a1;a2;……;am] A = [A;a_m+1]; %新写入一行,a_m+1=[a1,a2,……,an] C = [A B]; %按行合并A、B矩阵,A、B为同维矩阵 D = [A;B]; %按列合并A、B矩阵,A、B为同列矩阵

    获得特征值

    E = eig(A); %求矩阵A的全部特征值,构成向量E [V,D] = eig(A); %对A做相似变换后求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量 [V,D] = eig(A,'nobalance'); %直接求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量 A = compan(p); %A是p的友矩阵/伴侣矩阵

    矩阵运算

    det(A); %求A的行列式 A * B; %矩阵乘法 A .* B; %两矩阵对应元素相乘,相似的还有.^, ./ log(v); %取对数 exp(v); %取指数 inv(A); %对方阵A求逆 pinv(A); %对矩阵A求伪逆 A / B; %A*inv(B) A \ B; %inv(A)*B abs(v); %取绝对值 A < 3; %对A中每个元素进行判别,生成与A行列相同的0-1矩阵 sum(v); %若v为向量则对v求和,若v为矩阵则对列求和 sum(A,2); %对矩阵A按行求和 prod(v); %若v为向量则对v求积,若v为矩阵则对列求积 prod(A,2); %对矩阵A按行求积 cumsum(v); %若v为向量则返回对v累加向量,若v为矩阵则返回按列累加矩阵 cumsum(A,2); %返回按行累加矩阵 cumprod(v); %若v为向量则返回对v累积向量,若v为矩阵则返回按列累积矩阵 cumprod(A,2); %返回按行累积矩阵 mean(v); %若v为向量则对v求平均值,若v为矩阵则对列求平均值 mean(A,2); %对矩阵A按行求平均值 floor(A); %对A向下取整 ceil(A); %对A向上取整 find(cond); %找到并返回一列满足cond条件的元素序号(按列标号) [r,c] = find(cond); %找到并返回满足cond条件的元素序号,r与c均为列向量 val = max(v); %取每一列最大值 val = max(v,[],2); %取每一行最大值 [val,ind] = max(v); %取每一列最大值和最大值序号 val = max(max(A)) 或 val = max(A(:)); %获取A的最大值 norm(v,1); %求向量的1范数 norm(v,2)或norm(v); %求向量的2范数 norm(v,inf); %求向量的无穷范数 cond(v,1); %求向量的1范数的条件数 cond(v,2)或norm(v); %求向量的2范数的条件数 cond(v,inf); %求向量的无穷范数的条件数 trace(A); %计算矩阵的迹(主对角线元素之和) std(v); %计算v的标准差 std(A,flag,dim); %flag=0表示样本标准差,flag=1时表示总体标准差,默认为0;dim=1时按列,2为按行

    求协方差

    cov(x); %求向量方差 cov(A); %求矩阵协方差 cov(x,y); %求x与y的协方差,等同于cov([x y]) corrcoef(A); %求A的相关系数矩阵 corrcoef(x,y); %求x和y的相关系数,等同于corrcoef([x y])

    矩阵操作

    flipud(A); %将矩阵上下颠倒 fliplr(A); %将矩阵左右颠倒 rot90(A,k); %将矩阵A逆时针旋转90k度 diag(A); %取主对角线 diag(A,k); %取第k条对角线 diag(v)%用向量v生成对角阵 diag(v,k)%用向量v生成v在第k条对角线 tril(A); %取下三角阵 tril(A,k); %取第k条对角线以下的三角阵 triu(A); %取上三角阵 triu(A,k); %取第k条对角线以上的三角阵 vander(v); %生成范德蒙矩阵

    排序与插值

    排序

    sort(x); %对向量x升序排序 [Y,I]sort(X,dim); %Y为排序后的矩阵;dim=1为按列升序排序,2为按行升序排序;I为排序后元素的位置 -sort(-A)按降序排序

    插值 一维数组插值

    y1 = interp1(x,y,x1,'method')' %通过x,y两个等长向量计算x1处的y1的值,method为方法,包括linear,nearest,spline(三次样条插值),cubic(三次多项式插值)

    二维数组插值

    有x,y两组一维数组 [X,Y] = meshgrid(x,y); Z = X.^2 + Y.^2 z1 = interp2(x,y,Z,x1,y1,'method');若x1与y1都为列为2的行向量,则对2个点进行插值,若x1与y1分别为2维列向量和2列行向量,则对4个点插值。

    曲线拟合

    [P,S] = polyfit(x,y,m); %采样点x与采样点函数值y为等长函数

    多项式计算

    p = poly(x); %返回以x为根的多项式函数的系数 y = polyval(p,x); %求多项式p在x点处的值y x = roots(p); %返回以p为系数的多项式的根 conv(p1,p2); %求多项式p1和p2的乘积 [Q,r] = deconv(p1,p2); %Q为p1/p2的商,r为余式 polyder(p); %求多项式p的导数 polyder(p,q); %求多项式p*q的导数 [d,s] = polyder(p,q); %求多项式p/q的导数,分子存入d,分母存入s

    函数极值

    单变量: fmin(f,a,b); %单变量函数f(x)在区间[a,b]上的最小值点 多变量: fmins(F,X0); %多变量函数F(X)在估计值X0附近的最小值点

    无约束问题

    一元函数

    [x,fval] = fminunc(fun,x1,x2); %x1,x2为x范围 [x,fval] = fminunc(fun,x1,x2,options);

    多元函数

    x = fminunc(fun,x0); %从x0点开始,尝试找到fun中描述的函数的一个局部最小x。点x0可以是标量、向量或矩阵。 x = fminunc(fun,x0,options); %通过选项中指定的优化选项最小化函数。使用 optimset或optimoptions 设置这些选项。 x = fminunc(problem); %找到问题的最小值,其中问题是 Input Arguments 中描述的结构。 [x,fval] = fminunc( ___ ); %对于任何语法,返回目标函数在解x处的值 [x,fval,exitflag,output] = fminunc( __ ); %另外返回一个描述fminunc退出条件的exitflag值,以及一个包含优化过程信息的结构输出 [x,fval,exitflag,output,grad,hessian] = fminunc( ___ ); %还要返回梯度-解x处的梯度;解决方案x的x1和x2的偏导 options = optimoptions(SolverName,Name,Value,...)

    优化参数选项options: 可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外一些则只适用于中型问题。 首先描述适用于大型问题的选项。这仅仅是一个参考,因为使用大型问题算法有一些条件。对于fminunc函数来说,必须提供梯度信息。 LargeScale – 当设为’on’时使用大型算法,若设为’off’则使用中型问题的算法。 适用于大型和中型算法的参数: Diagnostics – 打印最小化函数的诊断信息。 Display – 显示水平。选择’off’,不显示输出;选择’iter’,显示每一步迭代过程的输出;选择’final’,显示最终结果。打印最小化函数的诊断信息。 GradObj – 用户定义的目标函数的梯度。对于大型问题此参数是必选的,对于中型问题则是可选项。 MaxFunEvals – 函数评价的最大次数。 MaxIter – 最大允许迭代次数。 TolFun – 函数值的终止容限。 TolX – x处的终止容限。 只用于大型算法的参数: Hessian – 用户定义的目标函数的Hessian矩阵。 HessPattern –用于有限差分的Hessian矩阵的稀疏形式。若不方便求fun函数的稀疏Hessian矩阵H,可以通过用梯度的有限差分获得的H的稀疏结构(如非零值的位置等)来得到近似的Hessian矩阵H。若连矩阵的稀疏结构都不知道,则可以将HessPattern设为密集矩阵,在每一次迭代过程中,都将进行密集矩阵的有限差分近似(这是缺省设置)。这将非常麻烦,所以花一些力气得到Hessian矩阵的稀疏结构还是值得的。 MaxPCGIter – PCG迭代的最大次数。 PrecondBandWidth – PCG前处理的上带宽,缺省时为零。对于有些问题,增加带宽可以减少迭代次数。 TolPCG – PCG迭代的终止容限。 TypicalX – 典型x值。 只用于中型算法的参数: DerivativeCheck – 对用户提供的导数和有限差分求出的导数进行对比。 DiffMaxChange – 变量有限差分梯度的最大变化。 DiffMinChange - 变量有限差分梯度的最小变化。 LineSearchType – 一维搜索算法的选择。 exitflag:描述退出条件 exitflag>0 表示目标函数收敛于解x处。 exitflag=0 表示已经达到函数评价或迭代的最大次数。 exitflag<0 表示目标函数不收敛。 output: 该参数包含下列优化信息: output.iterations – 迭代次数。 output.algorithm – 所采用的算法。 output.funcCount – 函数评价次数。 output.cgiterations – PCG迭代次数(只适用于大型规划问题)。 output.stepsize – 最终步长的大小(只用于中型问题)。 output.firstorderopt – 一阶优化的度量:解x处梯度的范数。

    约束问题

    [x y]=fmincon(f,x0,A,B); %A为不等式左边系数,B为不等式右边系数

    数据处理

    读取数据

    打开数据文件

    load <文件名>

    load ('<文件名>')

    数据处理

    查询已有变量名称

    who

    查询已有变量详细信息

    whos

    查询变量是否存在

    exist('im', 'var')

    清除变量

    clear

    清除屏幕

    clc

    清除图像

    clf

    控制语句

    循环操作

    for

    for 条件 循环语句; end;

    while

    while 条件 循环语句; 迭代语句; end;

    判断操作 if

    if 条件1 语块1; elseif 条件2 语块2; …… else 语块n; end;

    定义函数

    function [输出变量] = 函数名(输入变量) 函数体; end;

    数据保存

    保存数据

    save ('文件名.mat'); %保存所有变量 save 文件名.mat; %保存所有变量 save ('文件名.mat','x' 'y' ……); %保存x,y,……变量 save 文件名.mat x,y,……; %保存x,y,……变量 save 文件名.txt s -ascii; %保存x变量为txt,使数据可读

    绘图

    画直方图

    hist(w,n) %w为某一个向量,n为每一组的包含的个数

    描点画图

    plot(x,y,format); %x为自变量,y为因变量,format为格式 hold on; %同时画多个图 hold off; %hold on结束 xlabel('x轴标签'); ylabel('y轴标签'); legend('图例1','图例2',……) title('图表标题') axis([x1 x2 y1 y2]); %使x坐标范围为x1到x2,y坐标为y1到y2 cd '存储位置'; print -dpng '图片名.png'; %输出存储 %-dbmp:保存为bmp格式 %-dbmp:保存为bmp格式 %-djpeg:保存为jpeg格式 %-dpng:保存为png格式 %-dpcx:保存为pcx格式 %-dpdf:保存为pdf格式 %-dtiff:保存为tiff格式 imagesc(A); %将矩阵A中的元素数值按大小转化为不同颜色,并在坐标轴对应位置处以这种颜色染色 imagesc(x,y,A); %x, y分别为二维向量,在[x1,x2]*[y1,y2]范围内染色 imagesc(A),colorbar,colormap gray; %显示色柱图,并改成灰度图

    线型 线方式: - 实线 :点线 -. 虚点线 - - 波折线。 线型 点方式: . 圆点 +加号 * 星号 x x形 o 小圆 颜色: y黄; r红; g绿; b蓝; w白; k黑; m紫; c青.

    两个函数出现在两个图里

    feature(1);plot(x,y1); feature(2);plot(x,y2);

    将多个函数分别画在一个figure里

    subplot(m,n,1); %将figure划分为m×n块,对第一块进行操作 feature(2);plot(x,y2);
    Processed: 0.011, SQL: 9