Matlab 常用函数、常用绘图、基础操作总结文档 - 超全面个人总结

软件

基础操作

  • help
    • 使用help datatype可以直接查看相应数据类型可以应用的函数
    • 使用help function可以直接查看函数说明
  • 运算符
    • /:矩阵右除(A/B = A*inv(B),其中inv为求逆)
    • \:矩阵左除(A\B = inv(A)*B,其中inv为求逆)
    • ./:逐个相除
    • A&B:首先判断A的逻辑值,然后判断B的值,然后进行逻辑与的计算。(A和B可以为矩阵)
    • A&&B:首先判断A的逻辑值,如果A的值为假,就可以判断整个表达式的值为假,就不需要再判断B的值。(A和B不能是矩阵,只能是标量,但是显然单字符情况下&&速度更快)
  • 语句结构
    • for k = 0:1:20 xxx end
    • while flag xxx end
    • break:跳出
    • continue:跳过继续下一个
  • 全局函数
    • whos:列出工作区中的变量及大小和类型,可以括号内指定名字

函数定义

  • 说明
    • 建议使用匿名函数(效率更高)代替在线函数
    • 直接退出函数可以使用return
    • 异常使用:try xxx catch exception xxx end 来获取
  • 参数问题
    • 全局变量
      • nargin:获取输入参数数量
      • nargout:获取输出参数数量
      • msg = narhchk(low,high,number):检测参数数量
        • number小于low或者大于high返回对应错误消息提示
        • number介于low high之间返回一个空矩阵
      • varargin:用于接收无限参数(放到参数列表最后,cell格式)
      • varargout:用于输出无限结果(cell格式,接受需要使用[a,b,c])
        • function [varargout] = testF(inputArg1,varargin)
          • varargout{1} = 10;
          • varargout{2} = varargin{1};
          • varargout{3} = varargin{2};
        • end
        • [a,b,c] = testF(1,‘kkk’,4);
        • 结果为 10 kkk’ 4
      • nargchk(low,high,number):检查number是否介于low high之间
        • 介于:输出空矩阵
        • 不介于:输出字符串提醒number数量情况
        • 搭配使用error(nargchk(low,high,number))用来检查参数情况

    • 多参数
      • 使用列表或者cell矩阵接收参数
      • 定义fx(a,b)但是只输入一个参数也可以,此时使用nargout来辨别
      • 多参数情况下没有输入的参数一定不要调用,否则会直接出现错误
  • 在线函数
    • 简介:常作为参数传递给另一个函数
    • 创建
      • 使用字符串创建
      • f=inline(‘x.^2’,‘x’); => f(2)=4
      • f=inline(‘x+y’,‘x’,‘y’); => f(2,3)=5
  • 匿名函数
    • 简介:使用函数句柄来表示匿名函数
    • 创建
      • 函数句柄=@(变量名) 函数表达式
      • a=2;
      • f=@(x) x.^2; => f(2)=4
      • f=@(x) x.^2+a; => f(2)=6(可引用外部变量,且后期a=0不影响a=2)
      • f=@sin; %f(x)=sin(x) => f(pi/2)=1(可引用系统函数,且可省略参数)
      • f={@sin @cos}; => f{1}(pi/2)=1; f{2}(pi)=-1;(可以连续写两个组成cell列表)
    • 分段函数
      • 使用逻辑判断的特性可以构造分段函数的匿名函数
      • f=@(x) (x<1)*x + (x>1)*x^2
      • 因为< > 等符号满足时结果为1,否则为0
      • 但是这种函数无法用来求导,进行矩阵计算时计算量也会变得更大
    • 额外
      • 使用字符串创建:eval("f = @ (x) " + str + “;”)

解函数

  • feval(fun,x1,…,xm):
    • 求解函数结果(和eval类似,即解一个式子)
    • fun:函数句柄或者函数名称
    • x1-xm:输入参数进行求解
  • fzero(fun,x0):
    • 求函数=0的解,与feval不同的是这个是解未知数,与solve不同的是这个可以指定范围
    • fun:函数句柄或函数名称
    • x0:未知数范围,比如3表示求3附近的解,[1 3]求1-3之间的解
  • solve(eq,[eq1,qe2…eqn],[var],[var1,var2…varn])
    • 求代数方程的符号解析解
    • eq:方程等式(可以写多个)
    • var:变量名,可以全部忽略也可以对应方程全部写上去
  • 求最大最小值
    • diff(y,x):对y求x导,y中可以有多个未知数,如果y为匿名函数,那么y改为y(x)
    • solve:求零点
    • 求完导求零点即可找到极大极小值,也可以用fzero得到区域零点,如果没有那么就是单调

快捷键

  • 编辑窗口
    • Ctrl + I:⾃动对齐程序(整理缩进)
    • Ctrl + R:快速注释代码段
    • Ctrl + T:撤销注释的代码⾏
    • Ctrl + Z:撤销改动
    • Ctrl + Y:取消撤销(撒销过多时使⽤)
    • Tab:代码段右移
    • Shift + Tab:减少缩进
    • 输⼊函数的前⼏个字母,再按Tab:⾃动补全命令(记不全函数名时使⽤)
  • 代码调试
    • F5:可保存并直接运⾏程序
    • F9:执⾏选中代码段
    • F10:单步执⾏
    • F11:表⽰ step in,即当遇见⼦函数时,使⽤此快捷键,进⼊函数内部
    • Shift + F11:表⽰ step out,即使⽤此快捷键,执⾏完⼦函数的剩余程序,并跳出⼦ 函数
    • F12:设置断点
    • Ctrl + G:当程序源代码很长时,可能有⼏百上千⾏。有时错误出现在很后⾯的地 ⽅,需要⽤⿏标中间的滚轮往下滚很久,才能滚到想要的那⼀⾏。这 时,按Ctrl + G,就会跳出⼀个对话框,输⼊想要去的那⼀⾏的⾏号,就 可以直接跳过去了
    • Ctrl+ C:强制中断程序的运⾏

优化

  • 内存
    • 小变量:对于小变量一直进行拼接得操作,建议一开始就预分配空间
    • 矩阵 + 列表:数据类型内存预分配见后方矩阵一章开头介绍
    • 字符串拼接:
      • 对于字符串拼接同理,建议先在小长度上进行拼接,然后对中长度相互拼接
      • 切勿直接对高长度字符串反复拼接,因为寻找一个如此大块得内存并不容易
  • 循环
    • 对于循环操作的东西,使用矩阵进行优化,然后进行批量操作会大大加快速度
  • 文件读取
    • 对于excell文件的读取和导入相对比较慢,能用txt就尽量用txt

数据类型

  • 小知识
    • eps:浮点数的精度,表示1到用双精度浮点数表示的下一个数之间的距离
  • 数值
    • image.png
    • 这里主要是数字图像处理里边的东西
  • 虚数
    • imag:复数的虚部
    • abs:绝对值和虚数的模(向量长度)
    • A(imag(A)==0):获取A中所有实数
  • 类型转换
    • 直接使用类名即可,非常直接
      • 例如
        • A = logical(B):非0变为1,0变为0
        • C = uint8(B):大于255变为255,小于0变为0,其他照旧
      • 特点
        • 简单直接,不会进行其他运算,只是进行舍入
    • 使用函数进行转换(具有规则)
      • g = changeclass(newclass,f)
        • f:图像矩阵
        • newclass:新图像矩阵类别(可以是uint8,uint16,double)

      • 简单数值函数
        • image.png
        • im2unit8
          • f = [0.5 ,-0.6;1.3 , 3]
          • im2uint8(f):将小于0的变为0,大于1变为255,其他的乘255
          • 结果是[128,0;255,255]
        • mat2gray是将double数组归一化为[0,1]之间,out = (A-min(A)) / (max(A)-min(A))
        • im2double:将整数数据压缩到[0-1]之间,out = A / 255 或者 A / 65535
        • im2bw(f,T):将f中大于T的变为1,小于T的变为0,输出Logical矩阵(如果f为uint8则先除255)

绘图

通用函数

  • 全局
    • 无需对象
      • figure(x):绘制第x副图
      • hold on:保持下次绘图和上次绘图在一个figure中,且上一个图像不会被覆盖
      • box on:添加右侧与上侧刻度标尺
      • hidden off:消除隐线(三维图容易产生遮挡)
      • shading interp:消除格线(三维函数生成图时产生的边缘线)
        • shading faceted:默认模式,黑色格线
        • shading flat:每个网格和面颜色恒定
      • axis on:产生坐标轴,axis off:取消坐标轴
      • colormap([0 0 0]):设置图像色彩只有黑白
      • grid on:产生格线
      • grid off:取消格线
        • set(gca,‘YTickMode’,‘manual’,‘YTick’,[-5,0,5]) (设置格线)
        • set(gca,‘XTickMode’,‘manual’,‘XTick’,[-10,-5,0,5,10]))
      • box on:加边框线
      • clf:清除当前figure中的图像
      • xlabel():x坐标轴说明
      • ylabel():y坐标轴说明
      • title():添加标题
      • drawnow limitrate:更新所有图像(会直接显示,运行速度较快)
      • gcf返回当前Figure对象的句柄值
      • gca返回当前axes对象的句柄值
      • gco返回当前鼠标单击的句柄值
    • 需要对象
      • set(handle)列出句柄值为handle的对象的所有属性
      • get(handle)除列出上述属性外,还列出可以设置的属性
      • reset(handle)将所有属性改为默认值
      • delete(handle)删除句柄值为handle的图形对象
      • 说明:
        • 可以利用set(handle,‘属性名称’)获得句柄值为handle的对象的属性名称下所有可设置的属性值
      • findobj:返回Root对象与其所有子对象的句柄值
      • findobj(h):返回h变量的句柄值
      • findobj(‘属性名称’,‘属性值’):依据对象的属性名称和属性值找出匹配的对象句柄值。
      • findobj(ObjectHandles,‘属性名称’,‘属性值’):根据限定的对象列表找出与对象的属性名称和属性值匹配的对象句柄值
      • 子图绘制:
        • 常用subplot(2,2,1)来进行绘制,但是这样会产生比较大的图像间距,所以有下列使用
        • t = tiledlayout(2,2,‘TileSpacing’,‘Compact’,‘Padding’,‘Compact’);
          • TileSpacing:子图间距,Padding:子图与窗口边缘间距;Compact紧凑
          • 通过set(t)查看后主要属性就以上两个,同时需要绘制子图时使用nexttile表明需要绘制下一个图了
    • 注意
      • plot等的绘图是按照列来绘制的,如果给矩阵型坐标,那么每一列对应的点会连线,可以这样来一次性绘制多个相似但不同的图形
      • 子图绘制
  • 图像属性
    • legend()
      • 添加图例,对当前上下文绘图对象中的曲线依次添加图例
      • legend(h,‘First’,‘Second’,‘Third’):h为图像句柄,可选
    • text()
    • set()
      • 介绍
        • matlab给每个对象的每个属性都定义了一个名字,为属性名,其取值为属性值
        • 调用格式:set(句柄,属性名1,属性值1,属性名2,属性值2,…),句柄即对象引用,如句柄A = plot(x,y)
      • 例如:
        • set(gca,‘xtick’,X,‘ytick’,Y):设置网格的显示格式,gca获取当前figure的句柄
        • set(xlabel(‘Time’),‘FontSize’,12,‘Color’,‘r’):设置x标签为Time,设置字体颜色大小
        • set(h,‘Color’,‘r’,‘LineStyle’,‘–’):设置h对象颜色与线型
        • set(gca,‘XLim’,[3 40]):X轴的数据显示范围
        • set(gca,‘XTick’,[-3.14,0,3.14] ):X轴的记号点
        • set(gca,‘XTicklabel’,{‘-pi’,‘0’,‘pi’}):X轴的记号(列表稀疏可以拉开间隔)
        • set(gca,‘XTickLabelRotation’,25):X轴记号旋转多少度
        • set(gca,‘XTick’, []):清除X轴的记号点
        • set(gca,‘XGrid’,‘on’):X轴的网格
        • set(gca,‘XDir’,‘reverse’):逆转X轴
        • set(gca,‘XColor’,‘red’):X轴的颜色
        • set(gca,‘FontSize’,20):字体大小
        • set(gca,‘LineWidth’,20):线条宽度
        • set(gca,‘markersize’,20):标记点大小
    • axis()
      • 简介
        • axis([xmin xmax ymin ymax]):设置当前图形的坐标范围,分别为x轴的最小最大值,y轴的最小最大值
      • 例如
        • axis([-0.1, 8.1, -1.1, 1.1]):坐标轴的显示范围
      • 全局
        • axis on:打开所有的坐标轴标签、刻度、背景
        • axis off:去掉坐标轴
        • axis fill:使坐标轴可以包含整个绘制的区域。
          • 只有在PlotBoxaApectRatio或DataAspectRatioMode被设置为‘manual’才有效
        • axis ij:矩阵坐标模式。此时水平坐标轴从左到有取值,垂直坐标从上到下
        • axis xy:笛卡尔坐标模式。此时水平坐标从左到右取值,垂直坐标从下到上取值
        • axis tight:将坐标范围设定为被绘制的数据范围
        • axis square:将坐标轴设置为正方形
        • axis normal:将当前的坐标轴框恢复为全尺寸,并将单位刻度的所有限制取消
        • axis equal:设置屏幕高宽比,使得每个坐标轴的具有均匀的刻度间隔(等比刻度)
        • axis auto:将坐标轴刻度恢复为自动的默认设置
        • axis manual:冻结坐标轴刻度,此时如果hold被设定为on,那么后边的图形将使用与前面相同的坐标轴刻度范围

维度绘图

  • 一维
    • line([x1,x2],[y1,y2],‘Color’,‘red’)
      • Color:颜色(需要完整单词)
      • LineStyle:线形
      • LineWidth:线宽
      • 注意:line([1,2],[3,4])将画出(1,3)到(2,4)的一条直线,而不是(1,2)到(3,4)
    • animatedline(动画线条)
      • 创建对象 an = animatedline([ax],[Name,Value]);(对象可设置的属性可plot基本相同)
      • 添加点:addpoints(an,x,y,[z])
      • 更新点:drawnow limitrate
      • 清除点:clearpoints(an)(清除后需要更新一下)
      • 可以更改an的最大点数属性,到达最大点数之后回自动删除前边的点,像蛇一样

  • 二维
    • plot(x,y,‘CLM’)
      • C 代表颜色(Colors)
      • L 代表曲线的格式 (Line Styles)
      • M 代表曲线所用的线标(Markers)
      • 有关符号在下边的属性标题部分有详细介绍
    • fplot(f,[xinterval],[linestyle])
      • 绘制函数表达式
      • xinterval:x的区间,默认[-5,5]
      • linestyle:线型,老客户了,见通用函数
      • f = @(x) sin(x);
      • fplot(f,[-10,10])直接绘制
    • plotyy(x1,y1,x2,y2,[function])
      • 双纵坐标绘图,其实也可以使用hold on实现类似效果(都在一个图里画两个)
      • 其中x1,x2常用同一个x作为参数
      • function参数可选,用于指定绘图模式,常用模式为 plot, semilogx, semilogy, loglog, stem等
      • 如:plotyy(x,y1,x,y2,‘plot’,‘stem’)(一个正常绘图,一个火柴棒模型)
      • 参考:https://blog.csdn.net/weixin_45492560/article/details/113944060
    • subplot(i,j,n)
      • i:几行
      • j:几列
      • n:目前指定为第几个图
      • 相当于figure(),将子图转换为当前上下文的绘图对象
      • 使用subplot(2,2,[1,3])可以将1,3两幅图合并为一个图进行绘画(拉长了)
    • countour():绘制等高线
    • countourf():绘制带颜色填充的等高线
  • 三维
    • 通用
      • shading interp:插值,平滑小面描影并删除网格,消除黑线

    • view()
      • 改变相机(观察者位置)
      • view([45,20]):使用方位角改变相机位置,方位角45,仰角20
      • view([20,30,20]):使用坐标定义相机位置,三维坐标[20,30,20]
    • rotate(h,direction,alpha,[origin])
      • 用于旋转图形 h:图形对象引用(句柄)
      • direction:旋转中心轴的方向向量
      • origin:旋转中心轴的原点(和方向向量一起确定旋转轴,默认是[0,0,0])
      • alpha:旋转的角度(顺时针方向,对于方向向量而言)
    • colordef [options]
      • 注意只能给figure对象使用,且需要使用clf清空figure
      • colordef white:设置图形的背景颜色为白色;
      • colordef black:设置图形的背景颜色为黑色;
      • colordef none:将图形的背景颜色设置为软件默认的颜色;
    • colormap()
      • colormap(map):将图形设置为map颜色
      • colormap(‘default’):设置当前图形的颜色为默认颜色
      • cmap=colormap:获取当前图形的颜色矩阵
      • colormap中的颜色可以是自己定义的RGB颜色向量如[0,0,1],也可以使用matlab提供的颜色函数[jet、hsv、hot、cool、spring、summer、autumn、winter、gray、bone、copper、pink、lines]
      • 例如:colormap(jet)
    • colorbar()
      • colorbar;在当前轴右边显示颜色刻度
      • colorbar(‘off’);colorbar(‘hide’); colorbar(‘delete’):关闭当前图形所有轴的颜色标尺
      • colorbar(‘location’,‘North’):在图形中确定的地方产生颜色标尺
    • brighten(beta)
      • 当beta取[0,1]时,图形变亮;当beta取[-1,0]时,图形变暗;
    • plot3(x,y,z)
      • 其中x,y,z可以是同型矩阵,可以是向量(矩阵的情况下就是多个线)
      • plot3(x1, y1, z1, x2, y2, z2 …, xn, yn, zn) :多组x、y、z参数,每一组绘制一条曲线。
      • plot(x, y, z, 选项):选项用于指定线型,颜色和数据点标记
    • fplot3(xfun,yfun,zfun,[tinterval],[linestyle])
      • 绘制各轴函数表达式,不能将xfun,yfun,zfun替换成f
      • tinterval:t的区间,[-5 5]形式
      • linestyle:线型
      • xt = @(t) sin(t); yt = @(t) cos(t); zt = @(t) t;
      • fplot3(xt,yt,zt)直接绘制
    • fimplicit3(f,[interval],[linestyle])
      • 绘制三维隐函数
      • f = @(x,y,z) x.^2 + y.^2 - z.^2;
      • interval = [-5 5 -5 5 0 5];
      • fimplicit3(f,interval)
    • 顶级三维绘图
    • surf(X,Y,Z)
      • 参考:https://iymark.com/program/matlab-function-surf.html
      • 创建一个三维曲面图,自动随高度着色,将矩阵 Z 中的值绘制为 x-y 平面中的网格上方高度
      • surf(Z):将Z得行索引,列索引用作x坐标和y坐标
      • surf(Z,C):C指定颜色,颜色
      • surf(ax,___) 将图形绘制到 ax 指定的坐标区,而非当前坐标区中。坐标区引用为第一个参数
      • 可使用shading interp来消除黑线
      • surfc():加等高线版本的surf()
      • 与mesh区别详见mesh()函数部分
    • fsurf(f,[xinterval],[linestyle])
      • 绘制函数表达式,其中f可换为xfun,yfun,zfun使用t做自变量,具体参见plot3
      • xyinterval:xy的区间,[-5 5]形式为xy同范围,[-5 5 -3 3]前两个x范围,后两个y范围
      • linestyle:线型,老客户了,见通用函数
      • f = @(x,y) sin(x) + cos(y) ;
      • fplot3(f,[-10 10 -10 10])直接绘制
    • surfl()
      • 参考:https://iymark.com/program/matlab-function-surfl.html
      • 来绘制具有基于颜色图的光照的曲面图,可以指定光源位置,除了光源外和surf用法相同
      • surfl(X,Y,Z):自带默认光源的surf版本,将基于Z值与光源来绘制颜色
      • surfl(X,Y,Z,‘light’):自带matlab提供的光源的surf版本,光源位置更像在正上方
      • surfl(X,Y,Z,s,k) :s为光源的方向,k为反射常量
      • surfl(ax,___) :将图形绘制到 ax 指定的坐标区中
      • 修改属性:s = surfl(z) => s.EdgeColor = ‘none’ (去掉原本的黑边线)
      • 光源方向s:使用方位角确认,s=[45,20] 指方位角45度,仰角20度(就是三维极坐标系)
      • 反射常量k:k = [a,b,c,d] =>【环境光系数 + 漫反射系数 + 镜面反射系数 + 镜面反射亮度】
      • 光源:
        • light(‘position’, pos,‘color’,‘w’):position使用三维向量标明光源位置,color指定光源颜色
        • lightangle(az,el):使用角向量指定光源照射方向
        • 上述函数都可创建之后使用句柄.属性来改变,不知道属性都有啥的使用 set(x) 查看
        • 使用light之前,图形各处均采用相同强度的漫射光
      • lighting [options]
        • 改变渲染模式:注意要在使用了light或者lightangle之后再调用
        • option =** [flat , goutaud , phong , none]**
        • flat 入射光均匀洒落在图形上的每个面上,主要与facted配用,他是默认模式
        • gouraud 先对顶点颜色插补,再对顶点勾划的面色进行插补,用于曲面表现
        • phong 对定点出法线插值,在计算各个像素的反光,表现效果最好
        • **none **使所有光源关闭
      • material [options]
        • 改变材质:同样要在light后用
        • option =** [shiny** , dull , metal , default ]
        • shiny 使对象比较明亮;镜反射份额较大,反射光颜色仅取决于光源颜色。
        • dull 使对象比较暗淡;漫反射份额较大,没有镜面亮点,反射光颜色仅取决于光源颜色。
        • **metal **使对象带金属光泽;镜反射份额很大,背景光和漫反射份额很小,反射光颜色仅取决于光源和图形表面两者的颜色,该模式为默认设置。
        • default 返回默认设置模式。
      • shading [options](网格优化)
        • 用于控制曲面和补片图形对象的颜色着色,可以用于去除线条过密的时候黑麻麻一片
        • shading flat:网格线和面设为恒定颜色(线段端点或面角边处最小索引的颜色值)
        • shading faceted:具有叠加的黑色网格线的单一着色 => 默认的着色模式
        • shading interp:在每个线条或面中对颜色索引进行插值来改变该线条或面中的颜色,无黑线
        • shading(axes,…) :将着色类型应用于 axes_handle 指定的坐标区,如shading(gca,‘interp’)
    • mesh()
      • 用于绘制网格三维图,和surf使用方式相同,区别是不会随高度在表面着色,仅仅对线着色
      • [X,Y] = meshgrid(x,y) => mesh(x,y,z)
      • 其中x y z 为同样size的矩阵
      • meshc():带等高线版本的mesh()
      • meshz():带底座版本的mesh()
      • untitled.png
    • fmesh(f,[xyinterval],[linestyle])
      • 其中f可以用xfun,yfun,zfun(都使用t作为自变量)进行替代
      • 具体用法参加fsurf与fplot3
    • 点图
    • 设置坐标轴
      • set(gca,‘XTick’,0:1:100);
    • 添加标注
      • legend(‘主索节点连线’,‘下拉索下端’,‘下拉索上端’);

统计图

  • area()(面域图)
    • 使用area(x,y,0),其中0表示基值,即纵轴刻度从何开始
    • 可以直接使用area(Y)进行绘图,绘制的所有线是不会相交的,y值累加
  • stem()(茎秆图)
    • 和bar类似,多一个char参数filled,如果加上那么端点就是实心的
  • bar()(直方图)
    • bar()
      • bar(y):每个y对应一个条形,如果是矩阵,则根据y中的行对条形分组
      • bar(x,y):在x指定的位置绘制条形
      • bar(__,style):指定样式
        • grouped:将y中每一行展示为一组,如果是向量,就把所有条放到一组
        • stacked:为y中每一行展示位一条,直接累加,一个条形多个颜色
        • histc:显示直方图,其中条形紧挨在一起,不能指定 name - value 参数
        • hist:与histc不同的是每个条形位于x刻度上方而非使条形跨越x刻度
      • 注意bar中把单个向量按照列向量使用
      • b.CData:b = bar(),b.CData(2,:) = [0,0,0],单独控制一个柱子的颜色
    • barh()
      • 和bar()用法一样,但是绘制的条形图是横向的
    • bar3()
      • 绘制三维条形图,基础用法和bar相同,多了控制宽度的width参数
      • bar3(Z):绘制Z对应高度的三维条形图,三维仅仅为了方便观察,本质数据还是二维的
      • bar3(__,style):指定样式,相对于bar多了detached - x 方向上将 Z 中的每一行的元素显示为一个接一个的单独的块
    • bar3h()
      • 和bar3()用法相同,但是绘制的条形图是横向的
  • pie(饼图)
    • pie(X):绘制扇形图,按照所给X中的比例绘制
    • pie(X,explode):指定索引处扇形是否分离开,即产生间隙 X,ex plode 长度相同
    • pie(X,labels): labels = {‘Taxes’,‘Expenses’,‘Profit’}(指定对应扇形名称)
    • pie3(X):和pie用法完全一样,pie3(a,double(a==min(a))) 可以将最小部分弹出
  • scatter(散点图)
    • scatter(x,y):绘制散点图,相同大小,相同style
    • scatter(x,y,sz):绘制散点图,每个散点大小由sz指定,其中size(sz) = size(x) = size(y)
    • scatter(x,y,sz,c,‘filled’):指定每个散点的颜色,并填充散点其中size© = size(x)
    • scatter(x,y,sz,‘d’):指定散点的形状为菱形
    • 其他可修改的属性可以通过get() + 句柄.修改
    • scatter3(x,y,z):基本用法和scatter相同,但是结果为三维图形
  • plotmatrix(多图)
    • 参考:https://zhuanlan.zhihu.com/p/345737250
    • 有点花哨,不建议直接使用,使用subplot自定义更加好一点
    • a = rand(50,3); b = randn(50,3); plotmatrix(a,b)
    • image.png
    • 这里横坐标是a,均匀均布;纵坐标是b,随机分布。图窗第i行是b的第i列数据,第j列是a的第j列数据。
    • 例如,[2, 2],横坐标是a的第2列,纵坐标是b的第2列。

属性

  • 句柄属性设置方法
    • 创建对象x之后使用set(x)查看对象都有那些可以设置的属性以及对应的属性都有何选项
  • 线(形状 标记 颜色)
    • image.png
    • image.png
    • image.png
  • 颜色映射
    image.png
    • 使用对应名字加上括号填上数字就是把对应映射均分为几等份,不加则默认长度,例如gray(16)产生16阶灰度的图像

文件

图像

  • 读取
    • imread(‘filename’):支持GIF,但是imwrite不支持GIF
  • 写入
    • 灰度(二维)
      • A = rand(50);
      • imwrite(A,‘myGray.png’)
    • 真彩(三维.jpg)
      • A = rand(49,49);
      • A(:,:,2) = rand(49,49);
      • A(:,:,3) = rand(49,49);
      • imwrite(A,‘newImage.jpg’,‘quality’,‘q’):其中q代表图像质量介于1-100
    • print
      • print -fno -dfileformat -rresno filename
        • no:感兴趣的图形窗口的图形编号
        • fileformat:文件格式
        • resno:单位为dpi的分辨率
        • filename:我们希望为文件指定的文件名
      • 示例
        • print -f1 -dtiff -r300 aniun1
        • 将窗口1内容以300dpi的分辨率输出到一个名为aniun1的tif文件中
  • 显示
    • imshow(f,G):f:图像数组,G:灰度级别(也可以是colormap)
    • imshow(f,[low high])
      • 将所有小于low的灰度图像都显示为黑色,所有大于high的都显示为白色
      • 如果省略[ low high]只给一个[]那么自动将low high选取为图像中最大最小灰度,即将图像归一化,防止截断
    • imfinfo(‘filename’):显示图片的基本信息
    • whitebg(bg):修改图像背景,其中bg可以是’g’,‘green’,[r g b]等
  • 获取信息
    • [M,N] = size(im):获得图像像素大小(分别是行列)
  • 修改属性
    • 垂直翻转:fp = f(end👎1 , 😃;
    • 平均取样:fp = f(1:2:end , 1:2:end);
    • 绘制水平线:plot(f(512,:))
    • 图像运算符替代
      • image.png
    • 修改大小:B = imresize(A,scale,method)
      • 其中A缩放scale倍以后就是B
      • image.png
      • method参见上表

视频

  • 写入
    • GIF
      • F=getframe(gcf);
      • I=frame2im(F);(将frame转换为img)
      • [I,map]=rgb2ind(I,256);(将三维转换为平面图索引)
      • if pic_num==1
        • imwrite(I,map,‘test.gif’,‘gif’,‘Loopcount’,inf,‘DelayTime’,0.2);
      • else
        • imwrite(I,map,‘test.gif’,‘gif’,‘WriteMode’,‘append’,‘DelayTime’,0.2);
      • end
      • pic_num = pic_num + 1;
      • 注意每次绘图完毕之后使用drawnow limitrate更新才能获取最后图像
  • 内存播放
    • for i=1:100
      • m(i)=getframe % 获取figure内容图像
    • end
    • movie(m) % 用于吧frame重新演示一遍

数据

  • 路径
    • 函数
      • dir:列出文件夹内容以及各种文件信息,包括大小

  • 注意
    • matlab中字符串和数值无法直接拼装到一个列表的,即使一个矩阵的不同列也不行
    • 字符串和值放到一起的唯一方法就是使用cell数据结构进行装载
  • 表格
    • 读取xls:
      • [num,txt,cells] = xlsread(‘文件名’)
      • 也可以用来读取csv,更方便一些,cells功能多,但是占用内存大
      • C = readcell(filename):读取为cell
      • 其中num读取文件中的数字列,txt为字符串列
      • cells读取全部数据,但是为cell格式,需要转换
    • 读取csv:csvread(‘文件名’)
    • 通用读取:
      • A = readmatrix(filename,[opts],[name,value])
      • 红色部分为可选参数,函数会根据后缀名选择读取文件的方式
      • 文本:readmatrix(‘sp2017-2.csv’, ‘OutputType’, ‘string’);
      • 数字:readmatrix(‘sp2017-2.csv’, ‘OutputType’, ‘double’);
      • 类型包含:
        • image.png
      • 建议直接读取string,数字可以进行强转
    • 写入:
      • xlswrite(‘c.xls’,A)
  • 内部数据
    • 保存:save(‘file.mat’,‘A’)(A为变量名,file为文件名)
    • 加载:load(‘file.mat’)
    • 获取内存区变量信息:whos(‘name’)
  • 文档
    • 追加进txt:save([path, ‘data.txt’], ‘data’, ‘-ascii’, ‘-append’)
    • 字符串写入txt(打开后追加)
      • a = ‘abc’
      • fid = fopen(‘xxx.txt’,‘wt’,‘n’,‘UTF-8’)(其中n默认,UTF-8指编码方式)
      • fprintf(fid,‘%s\n’,a)(\n表示按列输入)
      • fclose(fid)
    • 读取txt
      • [A,COUNT]=fscanf(fid , format , size)
      • A用来存放读取的数据
      • COUNT返回所读取的数据元素个数
      • fid为文件句柄
      • format控制读取的数据格式,由%加上格式符组成,格式符有:
        • d(整型)
        • f(浮点型)
        • s(字符串型)
        • c(字符型)
        • 在%与格式符之间还可以插入附加格式说明符,如数据宽度等。
      • size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:
        • N(读取N个元素到一个列向量)、
        • inf(读取整个文件)、
        • [M,N](读数据到M×N的矩阵中,数据按列存放)
    • 打开方式
      • r:只读,必须存在
      • r+:读写,打开后先读后写,必须存在
      • w:写入,存在则更新,不存在则创建
      • w+:读写,先读后写,存在则更新,不存在则创建
      • a:在末端添加数据,不存在则创建
      • a+:先读后添加,不存在则创建

代码

常用

  • 基础
    • 清屏:clc
    • 暂停:pause(0.1)
    • 计时:tic开始 toc结束
    • 定义变量:syms xx
    • 等待输入:input(‘xx’)
    • 删除变量:clear xx
    • 上下颠倒:flipud(A)
    • 数组长度:length(a)
    • 矩阵尺寸:size(a)
    • 元素个数:numel(A)
    • 矩阵维度:ndims(A)
    • 求和:sum(A,[‘all’])
    • all、any和xor:
      • all(A):对于2 * 2 输出 1 * 2 logical向量表示每一列中是否全部都是非0元素
      • any(A):对于2 * 2 输出 1 * 2 logical向量表示每一列中是否包含一个非0元素
      • xor(A,B):输出AB相同size矩阵,表示每个元素对应异或结果(logical矩阵)
    • 最大值:
      • max(A,B)):取两个中每个元素最大的组成同纬度数组输出
      • max(A,[],1):取A中第一维度中最大的值组成向量输出
    • 异常
      • error(‘输入不符合要求’)(退出脚本)
      • warning(‘输入不符合要求’)(不会退出)
      • break:退出循环
    • 随机数
      • rand(2,3):产生2*3大小的随机矩阵,值为0-1
      • randn(2,3):产生2*3的随机矩阵,为正态分布,方差为1,标准差为1
    • 维度(dim,常用在函数内作为参数)
      • 第一维度是垂直,就是行数
    • 判断是否
      • iscell©:如果C是单元数组,则为真
      • iscellstr(s):如果s是字符串单元数组,则为真
      • ischar(s):若s是字符串,则为真
      • isempty(A):如果A是空数组[],则为真
      • isequal(A,B):如果AB拥有相同的元素和维数,则为真
      • isfeild(S,‘name’):若’name’是结构S的一个域,则为真
      • isfinite(A):若数组A元素有限,则为真
      • isinf(A):若数组A元素无限,则为真
      • isletter(A):A中元素是否是字母表中字符
      • islogical(A):是否是逻辑数组
      • ismember(A,B):若A的元素也是B的元素,则为真
      • isnan(A):A元素是否是NaN
      • issparse(A):A是否是稀疏矩阵(0的数量远远大于1,且分布无规律)
      • isstruct(S):S是否是结构体
  • 数学
    • 参考
    • 开方:sqrt()
    • 绝对值:abs()
    • 最小值:min()
    • 最大值:max()
    • 平均数:mean()
    • 标准差:std()
    • 四舍五入:round()
    • 四舍五舍:fix()
    • 变小舍入:floor()
    • 变大舍入:ceil()
    • 2的y次幂:pow2(y)
    • 强转浮点:double(a)(double(true)=1)
    • 逆时针旋转:rot90(A,times次数)
    • 构造旋转矩阵:rotx(30),roty(30),rotz(30)
      • 构造出能围绕指定轴逆时针旋转指定度数的旋转矩阵
      • 其中指定轴的正方向朝向屏幕,度数为360制
  • 输入输出
    • disp([‘’]):
      • 基本输出,一个字符串列表(列表可以套娃,但是数据类型必须为一种)
      • 如果是数字,必须使用num2str() 先进行转换
    • clc:清屏
    • t = input(‘message’):
      • 先输出message内容,然后等待输入之后的回车
      • 回车后将前边输入的内容赋值给t
  • 数据
    • class(a):判断数据类型
  • 高级
    • cumsum(A)
      • 累计和,如果是列表[1,2,3],结果是[1,3,6]
      • 如果是矩阵,[[1,2,3;1,2,3;1,2,3]] 结果是 [1,3,6;2,4,6;3,6,9] 即按列累计和
      • 使用cumsum(A,2)可进行按行累计和
    • flip(A) = flipud(A)
      • 从中间行翻转数组,如果A=[1;2;3],结果是[3;2;1](等价于函数flipud)
      • 使用flip(A,2)从中间列翻转数组,A = [1,2,3]结果是[3,2,1]

列表+矩阵

  • 常用函数
    • (end):在矩阵引用时end代表所在维度长度,A(end,end)取右下角元素
    • sortrows(A,[column],[direction],):按照所给维度以及行排序
    • reshape(a,n,m):将矩阵a重整为n*m矩阵,顺序为一列二列
    • find(通用查找)
      • x = find(A=1,[n],[direction])
        • x:表示符合条件元素索引,按列数(三排一列显示为3)
        • n:找到n个后暂停(结果至多返回n个)
        • direction:搜索方向,first表示从头开始,last代表从尾开始
      • [row,col,[v]] = find(A=1,[n],[direction])
        • v:符合条件的元素值
        • row:符合条件元素所在行
        • col:符合条件元素所在列
    • ismember(矩阵查找)
      • Lia = ismember(A,B)
        • 查找A是否含有元素在B中,含有则在相应位置置1,返回size与A相同
        • 其中B,A size不做限制,可以相互不等或者大于小于
        • A = [5 3 4 2]; B = [2 4 4 4 6 8]; 则 Lia = [0 0 1 1];
      • [Lia,Locb] = ismember(A,B)
        • Locb:对应元素的索引,size和A相同,索引值为B中按列数个数

  • 内存预分配
    • 数值型:
      • pre = zeros(m,n);
      • pre = ones(m,n);
    • 字符型:
      • pre = char(zeros(m,n));
      • pre = char(ones(m,n));
    • 字符串型:
      • pre = string(zeros(m,n));
      • pre = string(ones(m,n));
    • 结构体型
  • 列表
    • 常用
      • length(A):数组A的长度
      • numel(A):数组元素数目(cell也可用)
      • find(b~=0):b中不等于0的元素的索引:
      • ismember(a,b):a中与b相等的元素的01矩阵(可以颠倒ab位置得到0 1值)
      • [y,i] = sort(x):排序x得到排序后结果y和索引i
    • 切片
      • x1 = x(0:10)
    • 初始化
      • x = 0:0.1:10:创建从0-10等间隔0.1的列表
      • linspace(0,10,20):从0到10创建拥有20个等间隔数字的列表
  • 矩阵
    • 常用
      • 转置:A = B’
      • 索引:
        • A = B([1 2],[4 6]):即取出 14 16 24 26 四个位置的元素,这个方式某些情况似乎非常便捷
        • A = B(1:end):获取1-最后一行的所有元素
        • A = B(end👎1):获取所有元素的倒序
        • A = B(B>1):获取B中所有大于1的元素,结果是一个向量
      • 扩充+填补
        • padarray(A, padsize, [padval], [direction])
          • A:基础矩阵,direction:填充方向
          • padsize:需要额外填补的行数以及列数,如果是标量那就仅仅增加行数
          • padval:填补时使用的值,默认使用填补对应最边列数值
    • 初始化
      • [X,Y] = meshgrid(x,y)
        • 其中x,y为向量,结果矩阵大小为[ len(x) + len(y) ] * 2
        • 使用两个参数接收两个矩阵,相当于x的纵向复制 + y的横向复制
      • X = ones()
        • ones(4):创建一个4*4的1矩阵
        • ones(3,2):创建一个
        • ones(size(A)):创建一个和A大小相同的全1矩阵
      • X = zeros()
        • 基本用法和ones()相同,仅仅是创建出来的元素全部为0
      • X = true()
        • 基本用法参见ones(),创造出来元素全部为逻辑1,类型为logical
        • X = false()和true类似,但是元素都是0
      • X = magic(M)
        • 生成M*M大小的矩阵
        • 其中每一行元素之和,每一列元素之和,主对角线元素之和都相等
      • X = repmat()
        • repmat(‘a’,2,3):创建一个2*3矩阵,内容全部为a
        • repmat(‘a’,2):创建一个2*2矩阵,内容全部为a
        • repmat(‘ab’,2):创建一个2*1矩阵,内容为abab;abab(自动拼接)
        • 其中元素可以替换为矩阵,如repmat(A,2)创建一个size(A)*2大小的重复A的矩阵
        • 元素后的维度可以无限,如repmat(‘a’,2,3,4,5)创建一个234*5大小的四维矩阵
      • 随机数
        • rand(2,3):产生2*3大小的随机矩阵,值为0-1
        • randn(2,3):产生2*3的随机矩阵,为正态分布,方差为1,标准差为1

高级结构

  • 二进制
    • 常用函数
      • a = bin2dec(‘101’):返回一个二进制串的十进制数(a=5)

  • cell
    • 简介:
      • 是一种封装结构,内部可以防止各种类型
      • 拼接两个cell使用 a = [a;b] 和列表相同
    • 参考:
    • 访问
      • 使用(x,y)访问获得的是单个cell对象
      • 使用{x,y}访问获取的是cell的内容
    • 创建
      • cell(m,n):预创建元胞数组
      • cell = {[1,2,3] , [‘this’,‘is’,‘me’] , [] ; 214 , 5 , 1e-5}:直接创建
    • 格式转换
      • string(cell):全部size皆可转为string(双引号字符串)
      • char(cell):全部size皆拉为一列,形成一个字符串向量(单引号)
    • 常用函数
      • iscell(M):判断是否是元胞数组
      • celldisp(M):输出元胞数组内容
      • cellplot(A,‘legend’):绘制cell内容
  • table
    • 参考:https://blog.csdn.net/qq_43157190/article/details/104721950
    • 创建
      • tab = table(ListA,ListB,‘VariableNames’,ListcolName)
      • ListA与ListB都是列向量表示table的数据,且参数数目不定
      • 'VariableNames’表示列向量的名称,用于索引对应列
    • 访问
      • table(1,:) % 返回类型是table
      • table{1,:} % 返回类型是array
      • table.name % 返回类型是array,与上面的方法效果一样
  • map
    • 官方参考
    • 注意
      • 由于map是一个对象,所以map的copy只是进行句柄的复制
      • 对于复制后的句柄的操作都相当于在原来的对象上的操作
      • 如果是字符串key,需要使用char先将cell转换为字符串(key自动转换为cell的)
    • 创建
      • M = containers.Map(keySet,valueSet):其中keySet和valueSet都是列表
      • M = containers.Map:创建一个空的map
    • 获取 + 修改
      • 获取:使用M(‘keyname’)来获取对应的value
      • 修改:可以通过M(‘keyname’) = value来覆盖原来的value
    • 相关函数
      • TF = isKey(M,keySet):
        • 如果M中包含键keyset,则返回1否则0
        • 如果keyset为数组,那么TF也是数组
      • L = length(M)
        • 返回M中键值对的个数
      • keyset = keys(M)
        • 返回M中所有key组成的数组
      • remove(M,keyset)
        • 从map对象中删除键值对组
      • valueset = values(M)
        • 返回M中所有的值组成的数组
  • struct(结构体)
    • 创建
      • M = sturct(‘field1’,values1,‘field2’,values2,…):通过函数创建结构体
      • M={}:创建空的结构体
      • M.str = 0:访问或者赋值结构体内部组件
        • 值得注意的是str可以进行动态构造,比如M.(“a” + strb) = c
      • M(2).two = 0:定义多维结构体并赋值
      • M.str1.str2 = 0:定义套娃结构体并赋值
    • 输出
      • 通过M(1)输出第一维结构体内容
      • 通过M(1)

字符串

  • 基本知识
    • 创建
      • 使用’'单引号标识字符串
      • 使用字符串组成数组时需要每个字符串长度相同
    • 引号
      • 单双引号不同
        • 单引号用于字符串连接,无法用于组件数组(会被自动拼接)
        • 双引号不能直接使用索引访问,但是可以组成数组
      • 单引号转换为双引号可以直接使用B = string(A)其中A可以是数组,还可以是cell矩阵
    • 缺失
      • 缺失值显示为使用ismissing(s)来判断是否是缺失值
      • 空值为""使用==运算符即可识别
    • 连接
      • b = [a,c]
      • b = strcat(a,c)
  • 相关函数
    • 常规
      • length(a):获取长度(不能获取双引号长度,可单引号)
      • strlength(a):获取字符串长度(可以获取双引号字符串长度)
      • strcat(a,b):连接两个字符串,ab首先被去掉尾部空格(参数可为两个列表)
      • eval(s):将字符串中的内容作为命令执行
      • deblank(s):去掉s中的所有空格
    • 切割 + 选择
      • strsplit(a,b):将a以b作为分隔符分割开(异常费时间,非必要不使用)
    • 格式转换
      • abs:将字符串转为ASCLL码
      • char:将ASCLL码值转化为字符
      • mat2str:将矩阵转化为字符串
      • int2str:将整数转为字符串
      • num2str:将数值转为字符串
      • str2num:将字符串转为数值
    • 比较
      • strcmp(a,b):比较两个字符串是否相等
      • strncmp(s1,s2,n):比较两个字符串前n个字符是否相等。相等1,否则0
      • strcmpi(s1,s2):忽略字母大小,比较是否相等。相等返回1,否则,返回0
      • strncmpi(s1,s2,n):忽略字母大小,比较前n个字符是否相等。相等1,否则0
    • 查找 + 替换
      • findstr(s1,s2):返回短字符串在长字符串中的位置
      • strfind(s,pattern):返回s中匹配到的模式的起始索引(可为字符串和正则)
      • contains(s,pattern):s中包含pattern就返回1,true否则返回0,false
      • strrep(s1,s2,s3):将s1中所有s2替换为s3
      • a_cell = {‘ni’, ‘hao’}
      • idx = find(ismember(a_cell, ‘ni’ ))
      • idx = find(strcmp(a_cell, ‘ni’ ))
      • 第二个更快(字符串cell情况下)
    • 高级
      • 词频统计:
        • rank = tabulate(A)
        • A:字符串列表
        • rank:三列分别为单词,词频,占比
        • 使用sortrows(rank,-2);进行按词频排序
  • 正则表达式
    • 函数
      • startIndex = regexp(str,expression)
        • 匹配正则表达式,大小写敏感
        • 返回 str 中与该正则表达式指定的字符模式匹配的每个子字符串的起始索引。
        • 如果没有匹配项,则 startIndex 为空数组
        • [startIndex,endIndex] = regexp(str,expression):返回匹配项的开始和结束索引
      • regexpi
        • 匹配正则表达式,大小写不敏感
      • regexprep
        • 基于正则表达式进行字符替换
    • 元字符
      • . : 匹配任意一个字符
      • [c1c2c3]:匹配来自方括号内的任意一个字符(+,-,.,*,?,|,$ 按照字面处理, - 表示范围除外)
      • [^c1c2c3]:匹配除方括号内字符以外的任意一个字符(+,-,.,*,?,|,$ 按照字面处理, - 表示范围除外)
      • [c1-c2]:匹配介于 c1-c2 之间的任意一个字符
      • \w:匹配字母、数字、下划线中的任意一个字符 <==> [a-z_A-Z0-9]
      • \W:匹配除字母、数字、下划线以外的任意一个字符 <==> [^a-z_A-Z0-9]
      • \s:匹配任意一个空白符
      • \S:匹配任意一个非空白字符符
      • \d:匹配任意一个数字
      • \D:匹配任意一个非数字字符

方程 + 函数

  • 函数相关
    • 通用求解
      • 函数值代入:subs(z,x,xn)
        • 其中z为函数(如z = (y-yp)2/a2+(x-xp)2/b2-1)
        • xn是二次函数中需要代入x的值
        • 其中x和xn可以为一一对应的数组,z,x,xn内容都不为str格式,即单引号
      • 解函数:solve(zz)
        • 其中zz是可解的方程组
        • 如zz = subs(z,x,xn)
        • 使用之前一定要声明变量:syms x y;
      • 计算最终结果:eval()
        • 有时候结果是一个表达式,想要解出需要用此函数
      • 二次函数求根:roots([1,2,3])
        • 三次函数的话就依次递增参数即可
    • 函数拟合
      • 神级插值
      • 获取拟合对应点
        • y = spline(xs,ys,x)
          • xs 为 x原始数据list
          • ys 为 y原始数据list
          • x 是想要知道得x对应的点
          • y 是从曲线中得到的点
      • 获取方程结构参数
        • p =polyfit(x,y,次数)
          • 使用最小二乘法获取函数具体表达式(二元多次方程)
          • 其中p为方程系数列表,可以替换为[p,s,mu]
            • S:采样点的误差向量
            • mu(1):mean(X)平均值
            • mu(2):std(X)方差
        • yi = polyval(p,xi)
          • 通过polyfit到的结果与自变量值xi得到结果yi
          • 和polyfit配合使用
      • 常用绘图
  • 方程组相关
    • 求解方程组
%% 拉伸计算
changed_data = zeros(length(org_data1),3);
for i=1:10
    i
    syms x y z
    center = org_data1(i,:);
    top = org_data2(i,1:3);
    bottom = org_data2(i,4:6);
    
    a = (x-top(1))/(bottom(1)-top(1))-(y-top(2))/(bottom(2)-top(2))==0;
    b = (y-top(2))/(bottom(2)-top(2))-(z-top(3))/(bottom(3)-top(3))==0;
    
    d = 300^2-x^2-y^2-z^2 == 0;
    r = x^2/(4*m) + h-300 ;
    
    [x,y,z] = solve(a,b,d,[x,y,z]);
    
    if isempty(x)
        x = 0;
    else
        x = vpa(x(1));
    end
    if isempty(y)
        y = 0;
    else
        y = vpa(y(1));
    end
    if isempty(z)
        z = 0;
    else
        z = vpa(z(1));
    end
    changed_data(i,:) = [x(1),y(1),z(1)];
end

plot3(changed_data(:,1),changed_data(:,2),changed_data(:,3))

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值