当前位置 : 主页 > 编程语言 > 其它开发 >

Matlab基本语法(一)

来源:互联网 收集:自由互联 发布时间:2022-07-22
目录 Matlab 语法(一) 一、 概述 1、 应用简介 2、 界面简介 3、 基本使用 二、 变量 1、 创建变量 2、 显示变量 3、 多行编译 4、 格式化输出 三、 常用命令 1、 管理会话 2、 系统命令

目录
  • Matlab 语法(一)
    • 一、 概述
      • 1、 应用简介
      • 2、 界面简介
      • 3、 基本使用
    • 二、 变量
      • 1、 创建变量
      • 2、 显示变量
      • 3、 多行编译
      • 4、 格式化输出
    • 三、 常用命令
      • 1、 管理会话
      • 2、 系统命令
      • 3、 输入输出
      • 4、 数组矩阵
      • 5、 绘图命令
    • 四、 文件编程
      • 1、 M 文件
      • 2、 创建运行
    • 五、 数据类型
      • 1、 常用类型
      • 2、 类型转换
      • 3、 类型判断
    • 六、 运算符
      • 1、 算术运算符
      • 2、 关系运算符
      • 3、 逻辑运算符
      • 4、 按位运算符
      • 5、 集合运算符
    • 七、 流程结构
      • 1、 条件语句
      • 2、 循环语句
    • 八、 向量
      • 1、 创建向量
      • 2、 操作向量
      • 3、 向量运算
        • 3.1 加减
        • 3.2 标量乘法
        • 3.3 向量逆置
        • 3.4 向量追加
        • 3.5 向量大小
        • 3.6 向量积
        • 3.7 等距元素

Matlab 语法(一) 一、 概述 1、 应用简介

MATLAB(矩阵实验室)是用于数字计算,可视化和编程的第四代高级编程语言和交互式环境。

MATLAB由MathWorks开发。

官方文档:https://ww2.mathworks.cn/help/matlab/language-fundamentals.html

它允许矩阵操作;功能和数据绘制;算法的实现;创建用户界面;与使用其他语言(包括C,C ++,Java和FORTRAN)编写的程序进行交互;分析数据;开发算法;并创建模型和应用程序。

它具有许多内置命令和数学函数,可帮助您进行数学计算,生成图和执行数值方法。

2、 界面简介 3、 基本使用

MATLAB环境的行为就像一个超级复杂的计算器。您可以在>>命令提示符下输入命令。

MATLAB是一个解释型环境。换句话说,您给出了一个命令,MATLAB立即执行了该命令。

常用运算符和特殊字符

运算符 目的 + 加; 加法运算符 - 减; 减法运算符 * 标量和矩阵乘法运算符 .* 数组乘法运算符 ^ 标量和矩阵求幂运算符 .^ 数组求幂运算符 \ 左除法运算符 / 右除法运算符 .\ 数组左除法运算符 ./ 数组右除法运算符 : 冒号;生成规则间距的元素并表示整行或整列 () 圆括号;封闭函数参数和数组索引;重写优先级 [] 括号;附件数组元素 . 小数点 ... 省略号;行连续运算符 , 逗号;分隔一行中的语句和元素 ; 分号; 分隔列并抑制显示 % 百分号;指定注释并指定格式 ' 引用符号和转置运算符 .' Nonconjugated转置运算符 = 赋值运算符

特殊变量和常量

名称 意义 ans 最近计算的答案 eps 浮点精度 i,j 虚数单位√-1 Inf 无穷 NaN 未定义的数值结果(不是数字) pi π

保存文件和加载文件

save myfile  % 用于将工作空间中的所有变量保存为当前目录中扩展名为.mat的文件
load myfile  % 随时使用load命令重新加载文件
二、 变量 1、 创建变量

在MATLAB环境中,每个变量都是一个数组或矩阵

您可以通过简单的方式分配变量。例如,

x = 3  % 定义x并用值初始化它
% 它创建一个名为x的1乘1矩阵,并将值3存储在其元素中

sqrt(3)  % 匿名创建一个 ans = 9
% MATLAB将执行上述语句并返回以下结果
% ans = 9

a = 1; b = 3; c = a + b  % 多项创建变量

% 创建向量:向量是一维数字数组。MATLAB允许创建两种类型的向量,行向量和列向量

vec = [1, 2, 3, 4]  % vec = [1 2 3 4]也ok,创建行向量
vec_ = [1; 2; 3; 4]  % 创建列向量

r = [7 8 9 10 11];
t = [2, 3, 4, 5, 6];
res = r + t

% 创建矩阵:在MATLAB中,通过以空格或逗号分隔的元素的顺序输入每一行来创建矩阵,并用分号分隔行的结尾

temp = [1, 2, 3; 4 5 6; 7 8 9]  % 创建一个 3 x 3 的矩阵

注意:

  • 将变量输入系统后,您以后可以参考它
  • 变量在使用前必须具有值
  • 当表达式返回未分配给任何变量的结果时,系统会将其分配给名为ans的变量,该变量可在以后使用
2、 显示变量
who  % 显示您创建的所有的变量信息

whos  % 显示创建的所有变量,以及内存空间,和数据类型
3、 多行编译

可以使用省略号(...)将长作业扩展到另一行

d = 0 ...
+ 2 + 4 ...
+ 5  % 返回的结果是 11
4、 格式化输出

format:默认格式
format short:5字长定点数,显示5位(scaled fixed point format with 5 digits)
format long:15字长定点数,显示15位双精度,7位单精度(scaled fixed point)
format short e:5字长浮点数
format long e:15字长浮点数
format hex :16进制
format bank:定点货币形式
format rat:小数分数表示
format +:+,-,空格
format compact:压缩空格
format loose:括空格和空行
format long:15字长定点数
format short e:5字长浮点数
format long e:15字长浮点数
format short g:5位定点或浮点格式。
format long g:对双精度,显示15位定点或浮点格式,对单精度,显示7位定点或浮点格式

format short
4.678 * 4.9
三、 常用命令 1、 管理会话 命令 目的 clc 清除命令窗口 clear 从内存中删除变量 exist 检查文件或变量的存在 global 声明变量为全局变量 help 搜索帮助主题 lookfor 在帮助条目中搜索关键字 quit 停止MATLAB who 列出当前变量 whos 列出当前变量(长显示) 2、 系统命令 命令 目的 cd 更改当前目录 date 显示当前日期 delete 删除文件 diary 开启/关闭日记文件录制 dir 列出当前目录中的所有文件 load 从文件加载工作区变量 path 显示搜索路径 pwd 显示当前目录 save 将工作空间变量保存在文件中 type 显示文件的内容 what 列出当前目录中的所有MATLAB文件 wklread 读取.wk1电子表格文件 3、 输入输出 命令 目的 disp 显示数组或字符串的内容 fscanf 从文件中读取格式化的数据 format 控制屏幕显示格式 fprintf 执行对屏幕或文件的格式化写入 input 显示提示并等待输入 ; 禁止丝网印刷

fscanffprintf命令的行为像C的scanf和printf函数。它们支持以下格式代码-

格式代码 目的 %s 格式化为字符串 %d 格式化为整数 %f 格式化为浮点值 %e 以科学计数形式格式化为浮点值 %g 以最紧凑的格式进行格式化:%f或%e \n 在输出字符串中插入新行 \t 在输出字符串中插入一个选项卡 4、 数组矩阵 命令 目的 cat 连接数组 find 查找非零元素的索引 length 计算元素数 linspace 创建规则间隔的矢量 logspace 创建对数间隔的向量 max 返回最大元素 min 返回最小的元素 prod 每列的乘积 reshape 更改大小 size 计算数组大小 sort 对每一列进行排序 sum 对每列求和 eye 创建一个单位矩阵 ones 创建一个数组 zeros 创建一个零数组 cross 计算矩阵叉积 dot 计算矩阵点积 det 计算数组的行列式 inv 计算矩阵的逆 pinv 计算矩阵的伪逆 rank 计算矩阵的秩 rref 计算精简行梯形表格 cell 创建单元格数组 celldisp 显示单元格数组 cellplot 显示单元格数组的图形表示形式 num2cell 将数字数组转换为单元格数组 deal 匹配输入和输出列表 iscell 标识单元格数组 5、 绘图命令 命令 目的 axis 设置轴限制 fplot 函数的智能绘图 grid 显示网格线 plot 生成xy图 print 打印图或将图保存到文件中 title 将文本放在图的顶部 xlabel 在x轴上添加文本标签 ylabel 将文本标签添加到y轴 axes 创建轴对象 close 关闭当前图 close all 关闭所有地块 figure 打开一个新的图形窗口 gtext 通过鼠标启用标签放置 hold 冻结当前图 legend 用鼠标放置图例 refresh 重新绘制当前图形窗口 set 指定对象(例如轴)的属性 subplot 在子窗口中创建图 text 在图中放置字符串 bar 创建条形图 loglog 创建对数-对数图 polar 创建极坐标图 semilogx 创建半对数图(对数横坐标) semilogy 创建半对数图(对数纵坐标) stairs 创建楼梯图 stem 创建茎图 四、 文件编程

到目前为止,我们已经使用MATLAB环境作为计算器。但是,MATLAB还是一种强大的编程语言,也是一种交互式计算环境

在前面的章节中,您学习了如何从MATLAB命令提示符下输入命令。MATLAB还允许您将一系列命令写入文件并以完整的单元形式执行文件,例如编写函数和调用它

1、 M 文件

MATLAB允许编写两种程序文件-

  • 脚本−脚本文件是扩展名为.m的程序文件。在这些文件中,您编写了一系列要一起执行的命令。脚本不接受输入,也不返回任何输出。它们对工作区中的数据进行操作
  • 函数−函数文件也是扩展名为.m的程序文件。函数可以接受输入并返回输出。内部变量是函数的局部变量

您可以使用MATLAB编辑器或任何其他文本编辑器来创建.m文件。在本节中,我们将讨论脚本文件。脚本文件包含多行MATLAB命令和函数调用。您可以通过在命令行中输入脚本名称来运行脚本

2、 创建运行

要创建脚本文件,您需要使用文本编辑器。您可以通过两种方式打开MATLAB编辑器-

  • 使用命令提示符

    • edit 
      % Or
      edit <filename>
      
  • 使用IDE

    • mkdir progs    % 创建一个工作目录
      chdir progs    % 进入到目录中
      edit  prog1.m  % 创建文件,并且编辑文件
      

编写脚本:

NoOfStudents = 6000;
TeachingStaff = 150;
NonTeachingStaff = 20;

Total = NoOfStudents + TeachingStaff ...
   + NonTeachingStaff;
disp(Total);

创建并保存文件后,可以通过两种方式运行它-

  • 单击Run编辑器窗口上的按钮或
  • 只需在命令提示符下键入文件名(不带扩展名):>> prog1
五、 数据类型

MATLAB 不需要任何类型声明或维度语句。每当 MATLAB 遇到一个新的变量名,它就创建变量并分配适当的内存空间。

如果变量已经存在,那么MATLAB将用新内容替换原始内容,并在必要时分配新的存储空间

1、 常用类型 序号 数据类型和说明 1 int88位有符号整数 2 uint88位无符号整数 3 int1616位有符号整数 4 uint1616位无符号整数 5 int3232位有符号整数 6 uint3232位无符号整数 7 int6464位有符号整数 8 uint6464位无符号整数 9 single单精度数值数据 10 double双精度数值数据 11 logical逻辑值1或0,分别表示true和false 12 char字符数据(字符串存储为字符向量) 13 cell array索引单元格数组,每个单元格能够存储不同维度和数据类型的数组 14 structure类似于C的结构,每个结构都具有能够存储不同维度和数据类型的数组的命名字段 15 function handle指向函数的指针 16 user classes从用户定义的类构造的对象 17 java classes从Java类构造的对象 2、 类型转换 函数 作用 char 转换为字符数组(字符串) int2str 将整数数据转换为字符串 mat2str 将矩阵转换为字符串 num2str 将数字转换为字符串 str2double 将字符串转换为双精度值 str2num 将字符串转换为数字 native2unicode 将数字字节转换为 Unicode 字符 unicode2native 将Unicode字符转换为数字字节 base2dec 将N进制数字符串转换为十进制数 bin2dec 将二进制数字符串转换为十进制数 dec2base 将十进制数转换为字符串中的N进制数 dec2bin 将十进制转换为字符串中的二进制数 dec2hex 将字符串中的十进制数转换为十六进制数 hex2dec 将十六进制数字字符串转换为十进制数字 hex2num 将十六进制数字字符串转换为双精度数字 num2hex 将单精度和双精度转换为IEEE十六进制字符串 cell2mat 将单元格数组转换为数值数组 cell2struct 将单元数组转换为结构数组 cellstr 从字符数组创建字符串的单元格数组 mat2cell 将数组转换为单元格大小可能不同的单元格 num2cell 将数组转换为大小一致的单元格数组 struct2cell 将结构转换为单元格数组 3、 类型判断 函数 作用 is 检测状态 isa 确定输入是否为指定类的对象 iscell 确定输入是否为单元格数组 iscellstr 确定输入是否为字符串的单元格数组 ischar 确定项目是否为字符数组 isfield 确定输入是否为结构数组字段 isfloat 确定输入是否为浮点数组 ishghandle 适用于处理图形对象句柄 isinteger 确定输入是否为整数数组 isjava 确定输入是否为Java对象 islogical 确定输入是否为逻辑数组 isnumeric 确定输入是否为数值数组 isobject 确定输入是否为MATLAB对象 isreal 检查输入是否为实数数组 isscalar 确定输入是否为标量 isstr 确定输入是否为字符数组 isstruct 确定输入是否为结构数组 isvector 确定输入是否为向量 class 确定对象的类别 validateattributes 检查数组的有效性 whos 列出工作空间中的变量,包括大小和类型 六、 运算符

运算符是一个符号,告诉编译器执行特定的数学或逻辑操作。MATLAB设计为主要在整个矩阵和数组上运行。因此,MATLAB中的运算符既可以处理标量数据,也可以处理非标量数据。MATLAB允许以下类型的基本运算-

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 按位运算符
  • 集合运算符
1、 算术运算符

MATLAB允许两种不同类型的算术运算-

  • 矩阵算术运算
  • 数组算术运算

矩阵算术运算与线性代数中定义的相同。数组操作是在一维和多维数组上逐个元素执行的。

矩阵运算符和数组运算符之间用句点(。)符号进行区分。但是,由于矩阵和数组的加法和减法运算相同,因此两种情况下的运算符均相同。下表简要介绍了运算符

运算符 目的 + 加法或一元加号。A+B将存储在变量A和B中的值相加。A和B必须具有相同的大小,除非其中一个是标量。标量可以添加到任何大小的矩阵中。 - 减法或一元减法。A-B从A中减去B的值。A和B必须具有相同的大小,除非其中一个是标量。标量可以从任何大小的矩阵中减去。 * 矩阵乘法。C=A*B是矩阵A和B的线性代数积。更准确地说,\(C(i, j) = \sum_{k=1}^n {A(i, k)B(k, j)}\)对于非标量A和B,A的列数必须等于B的行数。标量可以与任意大小的矩阵相乘 .* 数组乘法。A.*B是数组A和B的逐元素乘积。A和B必须具有相同的大小,除非其中一个是标量 ^ 矩阵幂。如果p是标量,那么$X^p $是p的幂。如果p是整数,则通过重复平方计算幂。如果整数是负数,则X先倒数。对于p的其他值,计算涉及特征值和特征向量,因此如果[V,D]=eig(X),那么X^p = V*D.^ p / V .^ 数组幂。A.^B是元素A(i,j)为B(i,j)次方的矩阵。A和B必须具有相同的大小,除非其中一个是标量 \ 左除法运算符,如果A是方阵,则A\B与inv(A)*B大致相同,只是计算方式不同。如果A是一个n乘n的矩阵,而B是一个包含n个分量的列向量,或者是一个包含多个这样的列的矩阵,那么X=A\B是方程AX=B的解。如果A的比例严重或几乎是单数,则会显示一条警告消息 / 右除法运算符,B/A与B*inv(A)大致相同。更准确地说, B/A = (A'\B')'. .\ 数组左除法运算符,A.\B是元素B(i,j)/A(i,j)的矩阵。A和B必须具有相同的大小,除非其中一个是标量 ./ 数组右除法运算符,A./B是元素A(i,j)/B(i,j)的矩阵。A和B必须具有相同的大小,除非其中一个是标量 ' 矩阵转置。A'是A的线性代数转置。对于复矩阵,这是复共轭转置 .' 数组转置 a’是 a 的数组转置。对于复杂的矩阵,这不涉及共轭。 2、 关系运算符 符号 描述 < 小于 <= 小于等于 > 大于 >= 大于等于 == 等于 ~= 不等于 3、 逻辑运算符

MATLAB提供两种类型的逻辑运算符和函数

  • 元素级:这些运算符对逻辑数组的相应元素进行操作
  • 短路:这些运算符对标量和逻辑表达式进行运算

逐个元素的逻辑运算符在逻辑数组上逐个元素地进行操作。符号&,|和〜是逻辑数组运算符AND,OR和NOT

短路逻辑运算符允许逻辑运算短路。符号&&和|| 是逻辑短路运算符AND和OR

4、 按位运算符 函数 作用 bitand(a, b) 整数 a 和 b 的位与 bitcmp(a) a的逐位补码 bitget(a,pos) 在整数数组a的指定位置获取位 bitor(a, b) 整数a和b的位或 bitset(a, pos) 将bit设置为a的特定位置pos bitshift(a, k) 返回一个由向左移动ķ比特,相当于乘以2^ķ 。k的负值对应于右移位或除以2 | k | 并朝负无穷大四舍五入到最接近的整数。任何溢出位都将被截断。 bitxor(a, b) 整数 a 和 b 的位异或 swapbytes 整数 a 和 b 的位异或 5、 集合运算符 函数 描述 intersect(A, B) 设置两个数组的交集:返回A和B的公共值,返回的值按顺序排列 intersect(A, B, 'rows') 将A的每一行和B的每一列视为单个实体,并返回A和B的共用的行。返回矩阵的行按顺序排列 ismember(A, B) 返回一个与A大小相同的数组,其中包含1,其中A的元素位于B中,在其他位置,它返回0 ismember(A, B, 'rows') 将A的每一行和B的每一行视为单个实体,并返回一个包含1的向量,其中矩阵A的行也是B的行,在其他地方,它返回0 issorted(A) 如果元素按顺序排列,则返回逻辑1,否则返回逻辑0,。输入A可以是向量,也可以是单行或单列的数组,如果A和sort(A)的输出相等,则认为A被排序 issorted(A, 'rows') 如果二维矩阵A的行按顺序排列,则返回逻辑1,否则返回逻辑0,如果A和sortrows(A)的输出相等,则认为矩阵A是排序的 setdiff(A, B) 设置两个数组的差值:返回A中不在B中的值,返回数组中的值按排序顺序结构 setdiff(A, B, 'rows') 将A的每一行和B的每一列视为单个实体,并返回A中不在B中的行。返回矩阵的行按排序顺序排列。"rows"选项不支持单元格数组 setxor 两个数组异或 union 两个数组的并集 unique 数组中的唯一值 七、 流程结构 1、 条件语句

决策结构要求程序员应指定一个或多个要由程序评估或测试的条件,如果确定条件为真,则应指定要执行的一个或多个语句,如果条件为真,则可以选择要执行的其他语句。条件确定为假。

语句 说明 if...end 一个if...end语句有一个布尔表达式和一个或多个语句组成 if...else...end if语句后面跟一个可选的else语句,该语句在布尔表达式为false时执行 if...elseif...elseif...else...end if语句后面可以跟一个(或多个)可选的elseif,还有一个else语句,它对测试各种条件非常有用 if...if...end...end 可以在另一个if或else语句中使用一个if...else语句 switch switch语句允许根据值列表测试变量是否相等
a = 10; b = 23;
% 进行条件语句的判断
if a >= 10
    display "a大于10"
    if b > 20
        display "并且b大于20"
    end
end

switch a
    case 1
        display "a的值为1"   % 自动会进行中断循环,不需要加break
    otherwise
        display "a值不符合要求"
end
2、 循环语句

循环语句

类型 说明 for 多次执行一个语句序列,并简化管理循环变量的代码 while 在给定条件为真时重复一个语句或一组语句。 它在执行循环体之前测试条件

循环控制语句

语句 说明 break 终止循环语句,并在循环之后立即将执行转移到该语句 continue 使循环跳过其主体的其余部分,并在重复之前立即重新测试其状态
a = 10;
% while loop execution 
while( a < 20 )
   fprintf('while value of a: %d\n', a);
   a = a + 1;
end
% for initval:step:endval / initval:endval / initval
for b = 0: 10: 100
    fprintf("for value of b: %d\n", b)
end
% 也可以传入一个向量等
for a = [24,18,17,23,28]
   disp(a)
end
八、 向量

向量是一维数字数组。MATLAB允许创建两种类型的向量-

  • 行向量
  • 列向量
1、 创建向量
r_h = [7 8 9 10 11];  % 创建一个行向量
r_v = [1; 2; 3; 4; 5];  % 创建一个列向量
2、 操作向量
r_h = [7 8 9 10 11];  % 创建一个行向量
r_v = [1; 2; 3; 4; 5];  % 创建一个列向量
r_h(2)  % 获取第二个元素
r_v(1)  % 获取第一个元素
r_h(:)  % 遍历元素
% initval:step:endval / initval:endval / :
r_v(2: 5)  % 获取第2到5个元素,两端都可以获取到
3、 向量运算 3.1 加减

您可以添加或减去两个向量。两个操作数向量必须具有相同的类型并具有相同数量的元素

A = [7, 11, 15, 23, 9];  % 创建向量
B = [2, 5, 13, 16, 20];  % 创建向量
C = A + B;  % 进行向量运算
D = A - B;
E = A - 1;
disp(E);
disp(C);
disp(D)
3.2 标量乘法
v = [ 12 34 10 8];
m = 5 * v
3.3 向量逆置
r = [ 1 2 3 4 ];  % 行向量
tr = r';  % 进行逆置操作
v = [1;2;3;4];  % 列向量
tv = v';
disp(tr); disp(tv);
3.4 向量追加

MATLAB 允许您将向量附加到一起来创建新的向量。

如果您有两个包含n和m个元素的行向量r1和r2,则要创建一个包含n个元素和m个元素的行向量r,通过添加这些向量,您可以编写-

r = [r1,r2]

您还可以通过添加这两个向量来创建矩阵r,向量r2将是矩阵的第二行

r = [r1;r2]

但是,为此,两个向量都应具有相同数量的元素。

同样,您可以附加两个列向量c1和c2,其中n和m个元素数目。要创建由n个元素加上m个元素组成的列向量c,通过添加这些向量,您可以编写

c = [c1; c2]

您还可以通过添加这两个向量来创建矩阵c;向量c2将是矩阵的第二列

c = [c1, c2]

但是,为此,两个向量都应具有相同数量的元素。

r1 = [ 1 2 3 4 ];
r2 = [5 6 7 8 ];
r = [r1,r2]
rMat = [r1;r2]
 
c1 = [ 1; 2; 3; 4 ];
c2 = [5; 6; 7; 8 ];
c = [c1; c2]
cMat = [c1,c2]
3.5 向量大小

元素v1,v2,v3,…,vn的向量v的大小由以下公式给出

\[|v| = \sqrt{v_1^2 + v_2^2+ ...+v_n^2 } \]

您需要采取以下步骤来计算向量的大小

  • 使用array multiplication(.*)取向量与其本身的乘积。这将产生一个向量sv,其元素是向量v的元素的平方。

    sv = v.* v;

  • 使用sum函数获得sum向量v的元素的平方。这也称为向量v的点积。

    dp = sum(sv);

  • 使用sqrt函数获得总和的平方根,该平方根也是矢量v的大小。

    mag = sqrt(dp);

v = [1: 2: 20];   % 快速生成向量,相当于python里面的range(1, 20, 2)
sv = v.* v;       % 带元素的向量
                  % 作为v元素的平方
dp = sum(sv);     % 平方和——点积
mag = sqrt(dp);   % magnitude
disp('Magnitude:'); 
disp(mag);
3.6 向量积

两个向量a =(a1,a2,…,an)和b =(b1,b2,…,bn)的点积由下式给出:

\[ab=\sum_{k=1}^n{a_k\cdot b_k} \]

我们使用dot(a, b);计算点积

v1 = [2 3 4];
v2 = [1 2 3];
dp = dot(v1, v2);  % 计算点积
disp('Dot Product:'); 
disp(dp);
3.7 等距元素

MATLAB允许您创建具有均匀间隔元素的向量。

要创建一个向量v,其中第一个元素为f,最后一个元素为l,且元素之间的差值为任意实数n,则写为:

v = [f : n : l]

实例:

v = [1: 2: 20];
sqv = v.^2;
disp(v);
disp(sqv);

上一篇:水泽-信息收集自动化工具安装
下一篇:没有了
网友评论