Matlab基本语法(二)

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);  % 展示元素

% initval:step:endval / initval:endval / :
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表示,使得以下关系式成立:

\[AA^{-1}= A^{-1}A = 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) 是A(:,j),A(:,j + 1),...,A(:,k)。
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个输入参数
    % x2,x和
    % 常数项
    % 它返回根
    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)

    % 这个函数返回
    % 一元二次方程。
    % 它们是 x2,x 和
    % 常数项
    % 它返回根
    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
posted @ 2022-07-20 15:38  Kenny_LZK  阅读(554)  评论(0编辑  收藏  举报