MATLAB基础知识

一、数据类型

在这里插入图片描述

在这里插入图片描述

基本数值类型

1.不同细分类型的整型数之间不能直接运算;
2.整数只能与相同类的整数或标量双精度值组合使用。

1.浮点数包括单精度浮点数(single)和双精度浮点数(double);
2.realmax()、realmin()函数可以分别返回能表示的最大值、最小值;
3.class()函数返回输入参数的数据类型,没有预先声明的变量类型默认为double型。

a = realmax('double'),b = realmax('single')
a = realmin('double'),b = realmin('single')
class(pi)
class(3)

1.多个字符串可以形成矩阵,但每个字符串长度必须相等,不相等则可用空格补齐;
2.字符串常用函数。

逻辑型(logical)变量只能取true(1)或false(0),在访问矩阵元素时可以使用逻辑型变量取出符合某种条件的元素。

函数句柄可以方便函数名称的管理,也可以加快程序运行的速度。
原因:
将一个函数名称赋值给某函数句柄,则使用该函数名句柄时,关于该函数的信息已经载入工作空间中,系统不需要在每次调用时重新搜索一遍路径,而是在函数句柄包含的信息中直接找到函数的路径;另外。因为函数句柄包含了路径信息,在系统切换工作路径时,不需要将函数文件复制过来就可使用该函数。
函数句柄中包含的路径、函数句、类型及可能存在的重载方法等信息,可以用functions(function_handle)显示。

句柄的声明方法:
●直接使用@符号声明函数句柄,形式为:变量名 =@ 函数名
●用 str2func 函数,形式为:变量名 = str2func(‘函数名’)
●声明匿名函数句柄,形式为:变量名 =@ (输入参数列表)函数表达式
此处的函数可以是预定义函数,也可以是用户自定义的函数。声明函数句柄后,就可以像使用函数名一样使用该函数句柄。如声明 h =@ sin,就可以使用 h(pi)代替sin(pi)。

>> a = [1 4 7 9]          %向量x

a =

     1     4     7     9

>> h1 =@ sum              %直接声明h1为sum函数的句柄

h1 = 

    @sum

>> functions(h1)          %函数句柄h1包含的信息

ans = 

    function: 'sum'
        type: 'simple'
        file: ''

>> h2 = str2func('sum')   %用srt2func函数声明h为sum函数的句柄

h2 = 

    @sum

>> functions
Error using functions
Not enough input arguments.
 
>> functions(h2)         %函数句柄h2包含的信息

ans = 

    function: 'sum'
        type: 'simple'
        file: ''

>> sum(a)                %使用sum求和

ans =

    21

>> h1(a)

ans =

    21

>> feval('sum',a)

ans =

    21

>> feval(h2,a)

ans =

    21

句柄中的函数为自定义函数:

>> h3 =@ fun1

h3 = 

    @fun1

>> functions(h3)

ans = 

    function: 'fun1'
        type: 'simple'
        file: ''

匿名句柄

>> h4= @(x,y)x^(-2) + y^(-2);
>> functions(h4)

ans = 

     function: '@(x,y)x^(-2)+y^(-2)'
         type: 'anonymous'
         file: ''
    workspace: {[1x1 struct]}

Java对象(略)

>> version -java

ans =

Java 1.7.0_60-b19 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode

变量
保留变量

特殊变量取值
ansMATLAB中运行结果的默认变量
pi圆周率π
eps计算机中的最小数
flops浮点运算数
inf无穷大,如1/0
NaN不定值,如0/0、∞/∞、0*∞
i或j复数中的虚数单位,i=j=√-1
nargin函数输入变量数目
narout函数输出变量数目
realmax最大的可用正实数
realmin最小的可用正实数

结构体与元胞数组
普通的矩阵只能包含同一种数据类型的数据,且矩阵的行、列必须对齐。结构体包含若干字段,字段的值可以是任意数据类型和任意维数的变量,也可以是另一个结构数组。元胞数组的元素也可以是任意数据类型、任意维度的数据。与矩阵不同,元胞数组引用元素时使用操作符“{}”,此时得到的数据的类型是元素本身的类型,而使用操作符"[]"引用元素时,得到的是一个小一些的元胞数组。元胞数组的内存空间是动态分配的,因此更加灵活,但运行效率欠佳。
元胞数组可以直接创建,也可以使用cell函数创建。结构类型数据的创建也可直接创建,或是利用struct函数创建。
创建元胞数组:

 %利用单元索引创建一个2*2的元胞数组
>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2) = {'Anne Smith'};
>> A(2,1) = {3 + 7i};
>> A(2,2) = {-pi: pi/4 :pi};
>> A

A = 

          [3x3 double]    'Anne Smith'
    [3.0000 + 7.0000i]    [1x9 double]
 %利用内容索引创建元胞数组
>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
>> A(1,2) = {'Anne Smith'};
>> A{1,1} = [1 4 3; 0 5 8; 7 2 9];
>> A{1,2} = 'Anne Smith';
>> A

A = 

          [3x3 double]    'Anne Smith'
    [3.0000 + 7.0000i]    [1x9 double]
 %利用cell函数创建元胞数组
>> a = cell(4)

a = 

    []    []    []    []
    []    []    []    []
    []    []    []    []
    []    []    []    []

>> a = cell(3,4)

a = 

    []    []    []    []
    []    []    []    []
    []    []    []    []

创建结构体:

>> book.name = 'MATLAB';                   %直接创建结构型数组
>> book.price = 25;
>> book.pubtime = '2013';
>> book

book = 

       name: 'MATLAB'
      price: 25
    pubtime: '2013'

>> book2 = struct('name','MATLAB','price',25,'pubtime','2013');
>> book2

book2 = 

       name: 'MATLAB'
      price: 25
    pubtime: '2013'

>> whos
  Name       Size            Bytes  Class              Attributes                      
  book       1x1               556  struct                       
  book2      1x1               556  struct                       

字段完全相同的结构体常放在一起构成数组,成为结构数组。此时,可以用“[]”抽取出不同结构体的同一字段值,构成单独的数值数组。

 for i = 1:10;
            bookss(i).name = strcat('book', num2str(i));
            books(i).price = 20 + i;
            books(i).pubtime = '2013'
end

books = 

      price: 21
    pubtime: '2013'


books = 

1x2 struct array with fields:

    price
    pubtime


books = 

1x3 struct array with fields:

    price
    pubtime


books = 

1x4 struct array with fields:

    price
    pubtime


books = 

1x5 struct array with fields:

    price
    pubtime


books = 

1x6 struct array with fields:

    price
    pubtime


books = 

1x7 struct array with fields:

    price
    pubtime


books = 

1x8 struct array with fields:

    price
    pubtime


books = 

1x9 struct array with fields:

    price
    pubtime


books = 

1x10 struct array with fields:

    price
    pubtime

>> books(1)

ans = 

      price: 21
    pubtime: '2013'

>> price = [books.price]

price =

    21    22    23    24    25    26    27    28    29    30

结构数组相关函数
元胞数组相关函数

二、运算符

算数运算符、关系运算符、逻辑运算符(简单)
矩阵运算符和数组运算符(灵魂)

三、控制流

主要有6种,顺序结构、if-else-end分支结构、switch-case结构、try-catch结构、for循环结构和while循环结构。

1.顺序结构

顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。顺序结构可以独立使用构成简单的完整程序,常见的输入、计算、输出三部曲的程序就是顺序结构。
【例1-1】计算圆的面积

clear all
%定义变量r,并赋值
r = 6;
%计算圆的面积
S = pi*r*r
%输出面积
fprintf('Area = %f\n',S)



S =

  113.0973

Area = 113.097336

2.选择结构

MATLAB的选择结构与if语句和switch语句两种实现形式。if语句最为常用,switch语句则适用于选择分支比较整齐,分支较多,没有优先关系的场合。

if选择

1)最简if语句:

if expression
    commands
end

如果判决条件expression为真,则执行命令组,否则跳过该命令组。
2)可供选择的执行命令组有两组:

if expression                      %判决条件
    commands1                      %判决条件为真,则执行命令组1,并结束此结构
else
    commands2                      %判决条件为真,则执行命令组1,并结束此结构
end

3)可供选择的执行命令组有n(n>2)组:

if expression1                %判决条件               
    commands1                 %判决条件expresssion1为真,则执行commands1,并结束此结构
elseif expression2
    commands2                 
%判决条件expresssion1为假,则expresssion2为真,执行commands2,并结束此结构
…
else
    commandsn                %前面所有判决条件均为假,则执行commandsn,并结束此结构

【例1-2】用色彩与线型区分数据点的范围

clear all
n = 100
x = 1:n
y = randn(1,n)                     %产生100个元素服从正态分布的随机行数组
hold on 
for i = 1:n
    if y(i) < -1
        plot(x(i),y(i),'*m')       %<-1的点用梅红色的*标出
    elseif y(i) >= -1 & y(i) <= 1
        plot(x(i),y(i),'ob')       %-1~1之间的点用蓝色的o标出
    elseif y(i) >= 1
        plot(x(i),y(i),'xr')       %>1之间的点用红色的x标出
    end
end
hold off

在这里插入图片描述

switch选择

switch语句执行基于变量或表达式值的语句组,关键字case和otherwise用于描述语句组,只执行第一个匹配的情形。如用到switch则必须用case与之搭配。

switch switch_expression      %switch_expression为需要进行判决的标量或字符串
    case case_expression1
        statements1
        %如果switch_expression等于case_expression1,则执行statements1,并结束此结构
    case case_expression2
        statements2
        %如果switch_expression等于case_expression2,则执行statements2,并结束此结构
    …
    otherwise
        ststementsn
        %如果switch_expression不等于前面所有值,则执行statementsn,并结束此结构
end

说明:
1.switch-case结构的语法格式保证至少有一组指令组将会被执行;
2.switch-expression应为一个标量或字符串
【例1-3】以学生的成绩管理作为演示switch结构的应用,划分区域:满分(100)、优秀(90~ 99)、良好(80~ 89)、及格(60~79)、不及格(<60)。

clear all
for i = 1:10
    a{i} = 89 + i
    b{i} = 79 + i
    c{i} = 69 + i
    d{i} = 59 + i
end
c = [d,c]
Name = {'zhang','Lin','huang','chen','xu'}         %元胞数组
Score = {78,92,89,40,100}
Rank = cell(1,5)
%创建一个含有5个元素的结构体数组S,它有三个域:Name、Score、Rank
S = struct('Name',Name,'Score',Score,'Rank',Rank)
%根据学生的分数,求出相应的等级
for i = 1:5
    switch S(i).Score
        case 100
            S(i).Rank = '满分'
        case a
            S(i).Rank = '优秀'
        case b
            S(i).Rank = '良好'
        case c
            S(i).Rank = '不及格'
        otherwise
            S(i).Rank = '不及格'
    end
end
%将学生的姓名、得分、登记等信息打印出来
disp(['学生姓名    ','得分    ','等级'])
for i = 1:5
    disp([S(i).Name,blanks(6),num2str(S(i).Score),blanks(6),S(i).Rank])
end


学生姓名    得分    等级
zhang       78    不及格
Lin         92    优秀
huang       89    良好
chen        40    不及格
xu          100    满分
3.循环结构
for循环
for index = values
    statements
end

说明:
for指令后面的变量x是循环变量,for与end之间的组命令statements是循环体。循环体被重复执行的次数是确定的,该次数由values数组的列数决定。
【例1-4】
在这里插入图片描述

clear all
theta = -pi:0.01:pi
r = [2 * sin(5 * theta).^2;cos(10 * theta).^3;sin(theta).^2;5 * cos(3.5 * theta).^3]
for k = 1:4
    subplot(2,2,k)               %拆分窗口为2*2窗口
    polar(theta,r(k,:))*         %绘制极坐标图
end

在这里插入图片描述

while循环

while循环在一个逻辑条件的控制下重复执行一组语句一个不定的次数。

while expression
    statements
end

1.在while与end之间的命令组statements是循环体。MATLAB在运行while循环之前,首先检测expression的值,如果其逻辑值为真,则执行命令组statements;命令组statements第一次执行完毕后,继续检测expression的逻辑值,如果其逻辑值仍为真,则循环执行命令组statements,直到表达式expression的逻辑值为假时,结束while循环。
2.while循环和for循环的区别在于,while循环结构的循环体被执行的次数是不确定的,而for循环中循环体的被执行次数是确定的。
【1-5】利用while循环结构求方程x^3-2x-5的解。

clear all  
a = 0; fa = -Inf
b = 3; fb = Inf
while b - a > eps * b
    x = (a + b) / 2
    fx = x ^ 3 - 2 * x - 5
    if fx == 0
        break
    elseif sign(fx) == sign(fa)
        a = x;fa = fx
    else
        b = x;fb = fx
    end
end
disp('方程的解为:')
disp(x)
其他流程控制

1).break:break通常与if语句一起使用,用于在一定条件下跳出循环的执行。在有多重循环时,只能跳出break所在的最里层循环,无法跳出整个循环。
2).continue:continue用于结束本次for或while循环,紧接着程序开始执行下一次循环,并不跳出整个循环的执行。continue命令也常与if一起出现。continue与break的区别是,continue只结束本次循环,而break则跳出循环。
3).return:return命令可以直接结束程序的运行,并返回到上一层函数。
4).cho on/off:执行M文件时,显示/关闭显示文件中的命令。
5).pause:pause指令用于暂停程序,等待用户按任意键继续,pause(n)表示暂停n秒后继续执行。

4.错误控制结构

在程序设计中,有时候会遇到不能确定某段代码是否会出现运行错误的情况,这时候就可以用错误控制结构。MATLAB提供了try-catch结构用来捕获和处理错误。

try
    statements1       %命令组1总是首先被执行,如果正确,则执行完后结束此结构
catch exception
    statements2       %命令组1执行发生错误时,执行命令组2
end

说明:
1.命令组1发生错误时,才执行命令组2。try-catch结构只提供两个可供选择的命令组。
2.当执行statements1发生错误时,可调用lasterr函数查询出错的原因。如果函数lasterr的运行结果为空字符串,表示命令组1被成功执行了。
3.如果执行命令组2时又发生错误,MATLAB将会终止该结构。
【例1-6】编写代码,实现矩阵的矩阵转置、加和及两个矩阵的加和乘。

clear all
A = input('请输入矩阵A:')
B = input('请输入矩阵B:')
try
    A',A + A,A + B,A * B
catch
    disp('there is error:')
end
disp(lasterr)
四、M文件

在MATLAB命令行窗口中,输入命令系统就会马上执行,属于命令驱动模式。当命令较多时,采用命令驱动模式比较繁琐,不易保存和管理,此时就应使用MATLAB的M文件驱动模式。M文件扩展名为.m,是一种文本文件,可以用记事本打开,又分为脚本文件和函数文件。MATLAB的M文件编辑器提供了一个编辑、运行和调试程序的集成环境。创建M文件的方法如下:
1.在“文件”菜单下选择“新建”,再选择“脚本”或“子文件”,即可创建M脚本文件或M函数文件。
2.在工具栏中单击“新建”按钮,即新建了一个M脚本文件。
3.在命令行窗口输入edit并按回车,即新建了一个M脚本文件。edit后加文件名,可以新建指定文件名的M文件或打开已存在的M文件。

M脚本文件

M文件是一系列命令的集合,运行时,其中的变量保存于工作空间中。因此,它可以使用工作空间原有的变量。但反过来,不需要使用原有工作空间的变量时,这种机制可能会造成不可预知的错误。因此,规范的脚本文件往往以clear、close all等命令开头,以清除变量,关闭其他图形窗口。
执行方法:
1.工具栏运行
2.编辑窗口F5
3.命令行窗口输入脚本文件名按回车键
【例1-7】用M脚本文件对一组数据作线性回归,并绘图

clear all
x = [143 145 146 148 149 150 153 154 157 158 159 160 162 164]'
y = [11 13 14 15 16 18 20 21 22 25 26 28 29 31]'
x = [ones(length(x),1),x]
%线性回归
[b,bint,r,rint,stats] = regress(y,x)
 %r2越接近1,F越大,p越小(<0.05),回归效果越显著
 r2 = stats(1)
 F = stats(2)
 p = stats(3)
  %绘制原始数据和拟合的直线
 z = b(1) + b(2) * x
 subplot(2,1,1)
 plot(x,y,'o',x,z,'-')
  %绘制残差图
  subplot(2,1,2)
  rcoplot(r,rint)

在这里插入图片描述

M函数文件

与主程序文件区别:
1.由function起头,后面跟的函数名必须与文件名相同;
2.有输入/输出变元(变量),可进行变量传递;
3.除非用global声明,否则程序中的变量均为局部变量,不保存在工作空间中。
通常函数文件由五部分构成:函数定义行、H1行、函数帮助文本、函数体、注释。

function [ output_args ] = Untitled2( input_args )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here


end

【例1-8】创建一个func.m函数,如果输入参数只有一个x,则返回x;如果输入参数有两个(x、y),则返回sqrt(x^2 + y^2)。

function b = func(x,y)
%距离函数
%假如nargin = 1,则返回x
%假如nargin = 2,则返回sqrt(x^2 + y^2)
if nargin == 1
    b = x
else
    b = sqrt(x^2 + y^2)
end

>> func([3,5])                       %只有一个输入参数[3,5]

ans =

     3     5

>> func(3,5)                         %两个输入参数35


ans =

    5.8310

>> help func                         %使用help,显示注释内容
 距离函数
 假如nargin = 1,则返回x
 假如nargin = 2,则返回sqrt(x^2 + y^2)

说明:
1.H1行:
在函数文件中,其第二行一般是注释行,这一行称为H1行,实际上它是帮助文本中的第一行。H1行不仅可以由“help函数文件名”命令显示,而且,lookfor命令只在H1行内搜索,因此这一行内容提供了这个函数的重要信息。
2.函数帮助文档:
这一部分内容是从H1行开始到第一个非“%”开头行结束的帮助文本,它用来比较详细地说明这一函数。当在MATLAB命令行窗口下执行“help函数文件名”时,可显示出H1行和函数帮助文本
3.函数体:
函数体是完成指定功能的语句实体,它可采用任何可用的MATLAB命令,包括MATLAB提供的函数和用户自己设计的M函数。

注意:

在函数文件中,除了函数定义行和函数体之外,其他部分都是可省的。但是作为一个函数,应加上H1行和函数帮助文本以提高函数的可用性;加上适当注释以提高函数可读性。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该错误通常是由于 MATLAB 中的隐式类型转换导致的,通常可以通过显式类型转换来解决。在这种情况下,可以将 `mask` 数组转换为双精度类型,以便与 `img` 数组进行相乘,如下所示: ```matlab % 读取图像 img = imread('input.jpg'); % 对图像进行缺失处理 mask = rand(size(img)) > 0.5; % 随机生成缺失掩模 img_masked = img .* double(mask); % 将掩模应用到原图像上 % 使用加速近邻梯度算法进行图像补全 lambda = 1 / sqrt(max(size(img_masked))); % 正则化参数 max_iter = 200; % 最大迭代次数 epsilon = 1e-5; % 迭代终止条件 L = zeros(size(img_masked)); % 初始化低秩矩阵 S = zeros(size(img_masked)); % 初始化稀疏矩阵 Y = zeros(size(img_masked)); % 初始化拉格朗日乘子矩阵 for i = 1:max_iter % 迭代求解 % 更新低秩矩阵和稀疏矩阵 [L, S] = proximal_operator(img_masked - S - (1/lambda) * Y, 1/lambda); % 更新拉格朗日乘子矩阵 Y = Y + lambda * (img_masked - L - S); % 判断是否满足迭代终止条件 if norm(img_masked - L - S, 'fro') / norm(img_masked, 'fro') < epsilon break; end end img_reconstructed = uint8(L + S); % 重构图像 % 显示结果 figure; subplot(1, 2, 1); imshow(img_masked); title('缺失图像'); subplot(1, 2, 2); imshow(img_reconstructed); title('补全后图像'); ``` 在上述代码中,`mask` 数组被转换为双精度类型,以便与 `img` 数组进行相乘。在其他方面,代码与前面给出的代码示例相同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值