Matlab基本语法(二)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Matlab语法二

九、 矩阵

1、 创建矩阵

矩阵是数字的二维数组。

在MATLAB中您可以通过在每行中以逗号或空格分隔的数字输入元素并使用分号标记每行的结尾来创建矩阵。

例如让我们创建一个4×5矩阵

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]

2、 操作矩阵

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8]  % 创建一个 4 x 5 矩阵
a_34 = a(3, 4);  % 获取第三行第四列的元素
fprintf("(3, 4): %d\n", a_34);  % 展示元素

% initvalstependval / initvalendval / :
a_24_35 = a(2:4, 3:5);  % 获取矩阵中2-4行 3-5列的数据并组成一个新的矩阵
a_24_35
a(:, :)  % 遍历矩阵  

3、 矩阵运算

3.1 加减法

您可以添加或减去矩阵。两个操作数矩阵必须具有相同数量的行和列

a = [ 1 2 3 ; 4 5 6; 7 8 9];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a + b
d = a - b

3.2 除法

您可以使用左\或右/除法运算符对两个矩阵进行除法。两个操作数矩阵必须具有相同数量的行和列。

a = [ 1 2 3 ; 4 5 6; 7 8 9];
b = [ 7 5 6 ; 2 0 8; 5 7 1];
c = a / b  % 右除 A / B = A * (inv(B))
d = a \ b  % 左除 A \ B = inv(A) * B

3.3 标量运算

当您将一个矩阵加减乘或除以一个数字时这称为scalar operation标量运算

标量运算产生一个行数和列数相同的新矩阵原始矩阵中的每个元素都与这个数相加、相减、相乘或相除

a = [ 10 12 23 ; 14 8 6; 27 8 9];
b = 2;
c = a + b
d = a - b
e = a * b
f = a / b

3.4 矩阵转置

转置操作可切换矩阵中的行和列。它由单引号'表示。

a = [ 10 12 23 ; 14 8 6; 27 8 9]
b = a'

3.5 矩阵串联

您可以连接两个矩阵以创建更大的矩阵。这对方括号“ []”是串联运算符。

MATLAB允许两种类型的串联

  • 水平串联
  • 垂直串联

当您通过使用逗号分隔两个矩阵来连接它们时它们只是水平附加。这称为水平串联。

或者如果使用分号将两个矩阵分开则它们将垂直附加。这称为垂直串联。

a = [ 10 12 23 ; 14 8 6; 27 8 9]
b = [ 12 31 45 ; 8 0 -9; 45 2 11]
c = [a, b]  # 水平串联
d = [a; b]  # 垂直串联

3.6 矩阵乘法

假设两个矩阵A和B。如果A是一个m x n矩阵B是一个n x p矩阵它们可以相乘得到一个m x n矩阵C。只有当A中的列数n等于B中的行数n时矩阵相乘才可能。

在矩阵乘法中将第一矩阵中的行元素与第二矩阵中的相应列相乘。

所得矩阵C中第(i,j)个位置的每个元素是第一矩阵第i行的元素与第二矩阵第j列中相应元素的乘积之和。

MATLAB中的矩阵乘法是通过使用*运算符执行的。

a = [ 1 2 3; 2 3 4; 1 2 5]
b = [ 2 1 3 ; 5 0 -2; 2 3 -1]
prod = a * b

3.7 行列式

矩阵的行列式是使用MATLAB的det函数计算的。 矩阵A的行列式由det(A)给出。

a = [ 1 2 3; 2 3 4; 1 2 5]
det(a)

3.8 逆矩阵

矩阵A的逆由A -1表示使得以下关系式成立
A A − 1 = A − 1 A = 1 AA^{-1}= A^{-1}A = 1 AA1=A1A=1
矩阵的逆并不总是存在的。如果矩阵的行列式为零则逆不存在矩阵是奇异的。

使用inv函数可计算MATLAB中矩阵的逆。 矩阵A的逆由inv(A)给出。

a = [ 1 2 3; 2 3 4; 1 2 5]
inv(a)

4、 生成矩阵

生成矩阵

MATLAB 软件提供了四个用于生成基本矩阵的函数。

zeros全部为零
ones全部为 1
rand均匀分布的随机元素
randn正态分布的随机元素
zeros(5);  % 创建全为0的 5 x 5 矩阵
ones(4, 3)  % 创建全为1的 4 x 3 矩阵
eye(4)  % 创建一个 4 x 4 的单位矩阵
rand(3, 5);  # 创建一个随机数字的矩阵
magic(5);  % 创建幻方矩阵

幻方矩阵magic square是一个正方形当其元素按行列或对角线相加时会产生相同的和。

十、 数组

1、 创建数组

创建数组的方式类似于创建矩阵的方式

a = [7 9 5; 6 1 9; 4 3 2];
b = zeros(5);  % 创建一个5x5矩阵

多维数组

具有两个以上维的数组在MATLAB中称为多维数组。MATLAB中的多维数组是常规二维矩阵的扩展。

通常要生成多维数组我们首先创建一个二维数组并将其扩展。

例如让我们创建一个二维数组a

a = [7 9 5; 6 1 9; 4 3 2];  % 创建一个二维的数组
a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]  % 使得a变成一个三维数组

使用快速生成数组的方法生成三维数组

b = rand(4,3,2)  %  生成一个 4 x 3 x 2 的三维数组

我们还可以使用**cat()**函数来构建多维数组。它沿着指定的维度连接一个数组列表

语法B = cat(dim, A1, A2...)

参数

  • dim要创建的维度
  • A1要串联的数组数量根据维度数量来决定
a = [9 8 7; 6 5 4; 3 2 1];
b = [1 2 3; 4 5 6; 7 8 9];
c = cat(3, a, b, [ 2 3 1; 4 7 8; 3 9 0])  % 创建一个三维数组

2、 数组函数

功能作用
length向量长度或最大数组维数
ndims数组维数
numel数组元素数
size数组维数
iscolumn确定输入是否为列向量
isempty确定数组是否为空
ismatrix确定输入是否为矩阵
isrow确定输入是否为行向量
isscalar确定输入是否为标量
isvector确定输入是否为向量
blkdiag根据输入参数构造块对角矩阵
circshift循环移位数组
ctranspose复共轭转置
diag对角矩阵和矩阵的对角线
flipdim沿指定的维度翻转数组
fliplr从左到右翻转矩阵
flipud上下翻转矩阵
ipermute倒置 N-D 数组的维数
permute重新排列N-D数组的维数
repmat复制和切片数组
reshape重塑数组
rot90将矩阵旋转90度
shiftdim移动维度
issorted确定集合元素是否按排序顺序
sort按升序或降序对数组元素排序
sortrows按升序对行进行排序
squeeze删除单例维度
transpose转置
vectorize向量化表达
x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9];  % 创建一个向量
length(x)      % 输出向量的长度
y = rand(3, 4, 5, 2);  % 创建一个 3 x 4 x 5 x 2 的随机四维矩阵
ndims(y)       % 判断矩阵的维度
s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab'];  % 创建一个数组
numel(s)       % 获取数组里面的元素个数

% 矩阵移位
a = [1 2 3; 4 5 6; 7 8 9]  % 创建一个原始数组
b = circshift(a,1)         %  行向下移一位
c = circshift(a,[1 -1])    % 行向下移一位列向左移一位

3、 数组排序

v = [ 23 45 12 9 5 0 19 17]  % 创建一个向量
sort(v)                      % 进行排序
m = [2 6 4; 5 3 9; 2 0 1]    % 创建一个 3 x 3 的矩阵
sort(m, 1)                   % 给列进行排序
sort(m, 2)                   % 给行进行排序

4、 单元数组

单元数组是索引单元格的数组其中每个单元格可以存储不同维度和数据类型的数组。

cell函数用于创建单元格数组。单元格功能的语法是

C = cell(dim)
C = cell(dim1,...,dimN)
D = cell(obj)

参数

  • C是单元数组

  • dim是标量整数或整数向量用于指定单元格数组C的维数

  • dim1…dimN是指定C维数的标量整数N代表总维度数

  • obj是以下其中之一

    • Java数组或对象
    • .NET类型System.String或System.Object的数组
c = cell(2, 5);  % 创建一个 2 x 5 的元胞数组
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}  

5、 访问单元数组

有两种方法可以引用单元格数组的元素-

  • 将索引括在第一个方括号()中以引用单元格集
  • 将索引括在大括号{}中以引用单个单元格中的数据

当您将索引括在第一个括号中时它指的是单元格的集合。

圆括号中的单元格数组索引是指单元格集

c = cell(2, 5);  % 创建一个 2 x 5 的元胞数组
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};  % 给元胞数组赋值

% 索引是从 1 开始的
c(1, 1)  % 引用单元格集
% 您也可以使用大括号索引来访问单元格的内容
c{1, 1}  % 引用单元格中的数据
c{1, 2:4}  

十一、 冒号

colon(是在MATLAB中最有用的运算符之一。它用于创建向量下标数组和指定迭代

如果要创建包含1到10的整数的行向量请编写

示例

1:10

MATLAB执行该语句并返回包含1到10的整数的行向量

ans =                                                                           
                                                                                
   1    2    3    4    5    6    7    8    9   10

如果要指定一个增量值而不是一个值例如

示例

100: -5: 50

让我们再举一个实例

示例

0:pi/8:pi

您可以使用冒号运算符创建索引向量以选择行列或数组元素。

下表描述了它的用途让我们有一个矩阵A-

格式目的
A(:,j)是A的第j列。
A(i,:)是A的第i行。
A(:是等效的二维数组。对于矩阵这与A相同。
A(j:k)is A(j), A(j+1),…,A(k).
A(:,j:k)是AjAj + 1…Ak。
A(:,:,k)是第k个三维阵列A的页
A(i,j,k,:)是三维数组A中的向量。向量包括A(i,j,k,1)A(i,j,k,2)A(i,j,k,3)等。
A(是A的所有元素被视为一个单独的列。在赋值语句的左侧A:)填充了A并保留了之前的形状。在这种情况下右侧必须包含与A相同数量的元素。

创建一个脚本文件并在其中键入以下代码-

示例

A = [1 2 3 4; 4 5 6 7; 7 8 9 10]
A(:,2)      % A的第二列
A(:,2:3)    % A的第二列和第三列
A(2:3,2:3)  % 第二行和第三行以及第二列和第三列

十二、 数值

MATLAB支持各种数字类包括有符号和无符号整数以及单精度和双精度浮点数。默认情况下MATLAB将所有数值存储为双精度浮点数

您可以选择将任何数字或数字数组存储为整数或单精度数字

所有数值类型都支持基本数组运算和数学运算

1、 类型转换

功能作用
double转换为双精度数字
single转换为单精度数字
int8转换为8位有符号整数
int16转换为16位有符号整数
int32转换为32位有符号整数
int64转换为64位有符号整数
uint8转换为8位无符号整数
uint16转换为16位无符号整数
uint32转换为32位无符号整数
uint64转换为64位无符号整数
x = single([5.32 3.47 6.28]) .* 7.5  
x = double([5.32 3.47 6.28]) .* 7.5
x = int8([5.32 3.47 6.28]) .* 7.5
x = int16([5.32 3.47 6.28]) .* 7.5
x = int32([5.32 3.47 6.28]) .* 7.5
x = int64([5.32 3.47 6.28]) .* 7.5

2、 整型最值

函数**intmax()intmin()**返回可以用所有类型的整数表示的最大值和最小值

这两个函数都将整数数据类型作为参数例如intmax(int8)intmin(int64)并返回可以用整数数据类型表示的最大值和最小值

str = 'The range for %s is:\n\t%d to %d ';

% 显示最小和最大有符号整数数据
sprintf(str, 'int8', intmin('int8'), intmax('int8'))
sprintf(str, 'int16', intmin('int16'), intmax('int16'))
sprintf(str, 'int32', intmin('int32'), intmax('int32'))
sprintf(str, 'int64', intmin('int64'), intmax('int64'))
 
% 显示最小和最大无符号整数数据
sprintf(str, 'uint8', intmin('uint8'), intmax('uint8'))
sprintf(str, 'uint16', intmin('uint16'), intmax('uint16'))
sprintf(str, 'uint32', intmin('uint32'), intmax('uint32'))
sprintf(str, 'uint64', intmin('uint64'), intmax('uint64'))

3、 浮点最值

函数**realmax()realmin()**返回可以用浮点数表示的最大值和最小值

当使用参数“ single”调用两个函数时这两个函数都返回您可以用单精度数据类型表示的最大值和最小值当使用参数“ double”调用时这两个函数均返回您可以用参数表示的最大值和最小值。双精度数据类型

str = 'The range for %s is:\n\t%g to %g and\n\t %g to  %g';

% 显示最小和最大单精度
% 浮点数
sprintf(str, 'single', -realmax('single'), -realmin('single'),...
realmax('single'), realmin('single'))

% 显示最小和最大双精度
% 浮点数
sprintf(str, 'double', -realmax('double'), -realmin('double'),...
realmax('double'),realmin('double'))

十三、 字符串

1、 创建字符串

在MATLAB中创建字符串非常简单。实际上我们已经使用了很多次

my_string = 'nhooo''s com';  % 创建一个字符串
str_ascii = uint8(my_string)  % 8位 ascii 值
str_back_to_char= char(str_ascii)  % 将ASCII转换为字符串
str_16bit = uint16(my_string)  % 16位ascii值
str_back_to_char = char(str_16bit)

2、 字符串函数

功能作用
用于在字符数组中存储文本组合字符数组等的函数
blanks创建空白字符字符串
cellstr从字符数组创建字符串的单元格数组
char转换为字符数组字符串
iscellstr确定输入是否为字符串的单元格数组
ischar确定项目是否为字符数组
sprintf将数据格式化为字符串
strcat水平连接字符串
strjoin将单元格数组中的字符串连接为单个字符串
识别字符串部分查找和替换子字符串的函数
ischar确定项目是否为字符数组
isletter字母数组元素
isspace作为空格字符的数组元素
isstrprop确定字符串是否属于指定类别
sscanf从字符串读取格式化数据
strfind在另一个字符串中查找一个字符串
strrep查找并替换子字符串
strsplit在指定的分隔符处分割字符串
strtok字符串的选定部分
validatestring检查文本字符串的有效性
symvar确定表达式中的符号变量
regexp匹配正则表达式区分大小写
regexpi匹配正则表达式不区分大小写
regexprep使用正则表达式替换字符串
regexptranslate将字符串转换为正则表达式
字符串比较功能
strcmp比较字符串区分大小写
strcmpi比较字符串不区分大小写
strncmp比较字符串的前n个字符区分大小写
strncmpi比较字符串的前 n 个字符(不区分大小写)
用于将字符串更改为大写或小写创建或删除空格的函数
deblank从字符串末尾去除尾随空白
strtrim删除字符串的前导和尾随空格
lower将字符串转换为小写
upper将字符串转换为大写
strjust对齐字符数组

3、 字符串拼接

3.1 水平组合字符串

到目前为止我们讨论的字符串是一维字符数组。但是我们需要存储更多。我们需要在程序中存储更多维度的文本数据。这是通过创建矩形字符数组来实现的

创建矩形字符数组的最简单方法是根据需要垂直或水平连接两个或多个一维字符数组。

您可以通过以下两种方式垂直组合字符串

  • 使用MATLAB连接运算符[]并用分号分隔每一行。请注意在此方法中每行必须包含相同数量的字符。对于长度不同的字符串应根据需要使用空格字符填充。
  • 使用char函数。如果字符串的长度不同char会用尾随空格填充较短的字符串以便每行具有相同的字符数
name =     'Zara Ali                             ';
position = 'Sr. Surgeon                          '; 
worksAt =  'R N Tagore Cardiology Research Center';
profile = [name ', ' position ', ' worksAt]
profile = strcat(name, ', ', position, ', ', worksAt)


% 字符串单元格数组
str_array = {'red','blue','green', 'yellow', 'orange'};

% 将单元格数组中的字符串合并为单个字符串
str1 = strjoin(str_array, "-")
str2 = strjoin(str_array, ",")

您可以通过以下两种方式水平组合字符串

  • 使用MATLAB串联运算符**[]**并用逗号或空格分隔输入字符串。此方法保留输入数组中的所有尾随空格
  • 使用字符串串联函数 strcat此方法删除输入中的尾随空格

3.2 合成元胞数组

从前面的讨论中可以明显看出合并长度不同的字符串可能会很麻烦因为数组中的所有字符串都必须具有相同的长度。我们在字符串的末尾使用了空格来使它们的长度相等

但是组合字符串的更有效方法是将结果数组转换为单元格数组

MATLAB单元数组可以在数组中保存不同大小和类型的数据。单元数组提供了一种更灵活的方式来存储长度可变的字符串

cellstr函数将字符数组转换为字符串的单元格数组

name =     'Zara Ali                             ';
position = 'Sr. Surgeon                          '; 
worksAt =  'R N Tagore Cardiology Research Center';
profile = char(name, position, worksAt);
profile = cellstr(profile);
disp(profile)

4、 查找替换

students = {'Zara Ali', 'Neha Bhatnagar', ...
            'Monica Malik', 'Madhu Gautam', ...
            'Madhu Sharma', 'Bhawna Sharma',...
            'Nuha Ali', 'Reva Dutta', ...
            'Sunaina Ali', 'Sofia Kabir'};
 
% strrep函数搜索并替换子字符串。
new_student = strrep(students(8), 'Reva', 'Poulomi')
% 显示名字
first_names = strtok(students)

5、 比较字符串

str1 = 'This is test';
str2 = 'This is text';
if (strcmp(str1, str2))
   sprintf('%s and %s are equal', str1, str2)
else
   sprintf('%s and %s are not equal', str1, str2)
end

十四、 函数

1、 创建

函数是一起执行任务的一组语句。在MATLAB中函数是在单独的文件中定义的。文件名和函数名应该相同。

函数在其自己的工作空间也称为本地工作空间中对变量进行操作与在MATLAB命令提示符下访问的工作空间称为基本工作空间不同。

函数可以接受多个输入参数并且可以返回多个输出参数。

函数语句的语法是

function [out1,out2, ..., outN] = myfun(in1,in2,in3, ..., inN)

实例

以下名为mymax的函数应写入名为mymax.m的文件中。它以五个数字作为参数并返回最大的数字

创建一个函数文件命名mymax.m并在其中输入以下代码

function max = Mymax(n1, n2, n3)

    %此函数用于计算
    %输入五个数字
    max =  n1;
    if(n2 > max)
       max = n2;
    end
    if(n3 > max)
       max = n3;
    end
end

调用函数

max = myMax(1, 2, 3)  % 调用函数

2、 匿名函数

匿名函数就像传统编程语言中的内联函数一样是在单个MATLAB语句中定义的。它由一个MATLAB表达式以及任意数量的输入和输出参数组成

您可以直接在MATLAB命令行或在函数或脚本中定义匿名函数

这样您可以创建简单的功能而不必为其创建文件

从表达式创建匿名函数的语法是f = @(arglist)expression

power = @(x, n) x^n;  % 返回结果
ret = power(4.5, 1.5)  % 调用函数

3、 子函数

必须在文件中定义除匿名函数以外的任何函数。每个函数文件都包含一个首先出现的必需主函数以及在主函数之后并由其使用的任意数量的可选子函数

可以从定义主文件的文件外部从命令行或其他函数调用主函数但是不能从命令行或其他函数在功能文件外部调用子函数

子函数仅对主函数和定义它们的函数文件中的其他子函数可见

示例

让我们写一个名为quadratic的函数来计算一个二次方程的根。该函数包含三个输入二次系数、线性系数和常数项。它将回归根。

函数文件quadratic.m将包含主函数quadratic和子函数disc后者计算判别式。

创建一个函数文件 quadratic.m 并在其中输入以下代码

function [x1, x2] = quadratic(a, b, c)
    % 此函数返回
    % 二次方程。
    % 它需要3个输入参数
    % x2x和
    % 常数项
    % 它返回根
    d = disc(a,b,c);   % 调用子函数
    x1 = (-b + d) / (2 * a);
    x2 = (-b - d) / (2 * a);
    end  

function dis = disc(a, b, c) 
    % 函数计算判别式
    dis = sqrt(b ^ 2 - 4 * a * c);
end   

外部调用函数

quadratic(2, 4, -4)  % 调用函数

4、 嵌套函数

您可以在另一个函数的主体内定义函数。这些称为嵌套函数。嵌套函数包含任何其他函数的任何或所有组件。

嵌套函数在另一个函数的范围内定义它们共享对包含函数的工作区的访问。

嵌套函数遵循以下语法

function x = A(p1, p2)
    ...
    B(p2)
   	function y = B(p3)
       ...
       end
	...
end

实例

function [x1, x2] = quadratic2(a, b, c)
    function disc  % 嵌套函数
        d = sqrt(b^2 - 4*a*c);
    end   % 结束函数disc

    disc;  % 内部调用函数
    x1 = (-b + d) / (2*a);
    x2 = (-b - d) / (2*a);
end   % 结束函数 quadratic2

外部调用函数

quadratic2(2, 4, -4)

5、 私有函数

私有函数是仅对有限的一组其他函数可见的主函数。如果不想公开函数function(s)的实现可以将它们创建为私有函数

私有函数位于具有特殊名称 Private 的子文件夹中

它们仅对父文件夹中的函数可见

实例

让我们重写quadratic函数。不过这一次disc函数计算判别式将是一个私有函数

在工作目录文件夹中创建一个名为 private 的子文件夹在其中存储以下函数文件 disc.m

function dis = disc(a,b,c) 
    % 函数计算判别式
    dis = sqrt(b^2 - 4*a*c);
end      % 子函数结束

在您的工作目录中创建一个函数 quadratic3.m 并在其中输入以下代码

function [x1,x2] = quadratic3(a,b,c)

    % 这个函数返回
    % 一元二次方程。
    % 它们是 x2x 和
    % 常数项
    % 它返回根
    d = disc(a,b,c); 

    x1 = (-b + d) / (2*a);
    x2 = (-b - d) / (2*a);
end      % 结束 quadratic3

6、 全局变量

全局变量可以由多个函数共享。为此您需要在所有函数中将变量声明为全局变量

如果要从基本工作空间访问该变量请在命令行中声明该变量

全局声明必须在变量实际在函数中使用之前发生。最好将大写字母用作全局变量的名称以将其与其他变量区分开

实例

让我们创建一个名为average.m的函数文件并在其中输入以下代码

function avg = average(nums)
    global TOTAL
    avg = sum(nums)/TOTAL;
end

同时创建一个脚本文件并在其中键入以下代码

global TOTAL;  % 创建全局变量
TOTAL = 10;  % 给全局变量赋值
n = [34, 45, 25, 45, 33, 19, 40, 34, 38, 42];  % 传入向量
av = average(n)  % 求取平均值

十五、 数据导入

1、 importdata

方法说明
A = importdata(filename)从filename表示的文件中将数据加载到数组A中
A = importdata("-pastespecial")从系统剪切板而不是文件加载数据
A = importdata(_, delimiterln)将delimiterln解释为ASCII文件、文件名或剪切板数据中的列分隔符可以对上述语法中的任何输入参数使用delimiterln
A = importdata(_, delimiterln, headerlinesln)从ASCII文件文件名或剪切板中加载啊数据并从行headerlinesh + 1 开始读取数字数据
[A, delimiterOut, headerlinesOut] = importdata(_)使用前面语法中的任何输入参数返回delimiterOut中输入ASCII文件的检测到的分隔符字符和headerlinesOut中检测到的头行数

实例1读取图片信息

filename = 'smile.png';  % 其为png图片又多加了一个透明通道
A = importdata(filename);
image(A.cdata);  % 去除透明通道

实例2读取类似于Excel文件

filename = 'weeklydata.txt';  % 头部为标签其余为数据
delimiterIn = ' ';
headerlinesIn = 1;
A = importdata(filename,delimiterIn,headerlinesIn);

% View data
for k = [1:7]
   disp(A.colheaders{1, k})
   disp(A.data(:, k))
   disp(' ')
end

2、 底层方法

importdata函数是一个高级函数。MATLAB中的底层文件I/O函数允许对文件的读写数据进行最大程度的控制。但是这些函数需要更详细的文件信息才能有效地工作。

函数描述
fclose关闭一个或所有打开的文件
feof文件结尾测试
ferror有关文件I/O错误的信息
fgetl从文件中读取行删除换行符
fgets从文件中读取行保留换行符
fopen打开文件或获取有关打开文件的信息
fprintf将数据写入文本文件
fread从二进制文件读取数据
frewind将文件位置指示器移动到打开文件的开头
fscanf从文本文件读取数据
fseek移动到文件中的指定位置
ftell在打开文件中的位置
fwrite将数据写入二进制文件

MATLAB提供以下功能用于文本数据文件的底层导入

  • fscanf函数读取文本或ASCII文件中的格式化数据
  • fgetlfgets的时间其中一个换行字符的每一行分离功能读取的文件的一行
  • fread函数读取字节或位级别的数据流

数据

Rainfall Data
Months: June, July, August
 
M = 3
12:00:00
June-2012
17.21  28.52  39.78  16.55 23.67
19.15  0.35   17.57  NaN   12.01
17.92  28.49  17.40  17.06 11.09
9.59   9.33   NaN    0.31  0.23 
09:10:02
July-2012
12.76  16.94  14.38  11.86 16.89
20.46  23.17  NaN    24.89 19.33
30.97  49.50  47.65  24.45 34.00
18.23  30.34  27.95  16.46 19.34

我们将从该文件导入数据并显示此数据。采取以下步骤

  • 使用fopen函数打开文件并获取文件标识符

  • 用来描述文件中的数据格式说明符例如’ %s’表示字符串’ %d’表示整数或’ %f’表示浮点数

  • 要跳过文件中的文字字符请在格式说明中包括它们。要跳过数据字段请在说明符中使用星号‘*’。

    例如要读取标头并返回M的单个值我们这样写

    M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1);
    
  • 默认情况下fscanf根据我们的格式说明读取数据直到找不到与数据匹配的内容或者到达文件末尾为止。在这里我们将使用for循环读取3组数据并且每次将读取7行和5列

  • 我们将在工作区中创建一个名为mydata的结构以存储从文件中读取的数据。这种结构有三个字段-time, month, and raindata数组

filename = '/data/myfile.txt';
rows = 7;
cols = 5;

mydata = struct([])  % 创建一个结构体数组
 
% 打开文件
fid = fopen(filename);
 
% 读取文件头找到
M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1);
 
% 读取每一组测量数据
for n = 1:M
   mydata(n).time = fscanf(fid, '%s', 1);
   mydata(n).month = fscanf(fid, '%s', 1);
 
   % fscanf按列顺序填充数组
   % 把结果转置
   mydata(n).raindata  = ...
      fscanf(fid, '%f', [rows, cols]);
end
for n = 1:M
   disp(mydata(n).time), disp(mydata(n).month)
   disp(mydata(n).raindata)
end
 
% 关闭文件
fclose(fid);

十六、 数据输出

1、 基础

数据导出(或输出)在 MATLAB 的意思是写入文件。MATLAB 允许您在另一个读取 ASCII 文件的应用程序中使用您的数据。为此MATLAB 提供了几个数据导出选项。

您可以创建以下类型的文件-

  • 数组中的矩形、分隔的ASCII数据文件。
  • 击键的日记或日志文件和结果文本输出。
  • 使用底层函数如fprintf的专用ASCII文件。
  • MEX文件用于访问以特定文本文件格式写入的C / C ++或Fortran例程。

除此之外您还可以将数据导出到电子表格。

有两种方法可以将数字数组导出为定界的ASCII数据文件-

  • 使用save函数并指定**-ascii**限定符

    • save my_data.out num_array -ascii
      

      my_data.out是创建的带分隔符的ASCII数据文件num_array是数字数组并且 −ascii是说明符

  • 使用dlmwrite函数

    • dlmwrite('my_data.out', num_array, 'dlm_char')
      

      my_data.out是创建的带分隔符的ASCII数据文件num_array是数字数组 dlm_char是分隔符

实例

num_array = [ 1 2 3 4 ; 4 5 6 7; 7 8 9 0];

% 使用 save 方法
save array_data1.out num_array -ascii;
type array_data1.out

% 使用 dlmwrite 方法
dlmwrite('array_data2.out', num_array, ' ');
type array_data2.out

2、 日记文件

记文件是您的MATLAB会话的活动日志。日记功能可以在磁盘文件中创建会话的精确副本但不包括图形。

要打开日记函数请输入

diary

可选您可以提供日志文件的名称例如

diary logdata.out

关闭日记函数

diary off

您可以在文本编辑器中打开日记文件

3、 底层方法

到目前为止我们已经导出了数字数组。但是您可能需要创建其他文本文件包括数字和字符数据的组合非矩形输出文件或具有非ASCII编码方案的文件。为此MATLAB提供了底层fprintf函数

与在底层I / O文件活动中一样在导出之前您需要使用fopen函数打开或创建文件并获取文件标识符。默认情况下fopen打开文件以进行只读访问。您应指定写入或追加的权限例如“ w”或“ a”

处理完文件后需要使用**fclose(fid)**函数将其关闭

示例

% 创建一个包含两行的矩阵y
x = 0:10:100;
y = [x; log(x)];
 
% 打开文件进行写入
fid = fopen('logtable.txt', 'w');
 
% 表格标题
fprintf(fid, 'Log     Function\n\n');
 
% 按列顺序打印值
% 文件的每一行上显示两个值
fprintf(fid, '%f    %f\n', y);
fclose(fid);

% 显示创建的文件
type logtable.txt
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6