目录

MATLAB - 快速指南

MATLAB - Overview

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

MATLAB由MathWorks开发。

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

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

MATLAB的计算数学的力量

MATLAB用于计算数学的各个方面。 以下是一些常用的数学计算,它最常用 -

  • 处理矩阵和数组
  • 二维和三维绘图和图形
  • Linear Algebra
  • 代数方程
  • 非线性函数
  • Statistics
  • 数据分析
  • 微积分和微分方程
  • 数值计算
  • Integration
  • Transforms
  • Curve Fitting
  • 各种其他特殊功能

MATLAB的特点

以下是MATLAB的基本功能 -

  • 它是数值计算,可视化和应用程序开发的高级语言。

  • 它还为迭代探索,设计和解决问题提供了交互式环境。

  • 它为线性代数,统计,傅立叶分析,滤波,优化,数值积分和求解常微分方程提供了大量的数学函数库。

  • 它提供了内置图形,用于可视化数据和工具,用于创建自定义图。

  • MATLAB的编程接口提供了用于提高代码质量可维护性和最大化性能的开发工具。

  • 它提供了使用自定义图形界面构建应用程序的工具

  • 它提供了将基于MATLAB的算法与外部应用程序和语言(如C,Java,.NET和Microsoft Excel)集成的功能。

MATLAB的用途

MATLAB被广泛用作科学和工程中的计算工具,包括物理,化学,数学和所有工程流。 它用于一系列应用,包括 -

  • 信号处理和通信
  • 图像和视频处理
  • 控制系统
  • 测试和测量
  • 计算金融
  • 计算生物学

MATLAB - Environment Setup

本地环境设置 (Local Environment Setup)

设置MATLAB环境只需点击几下。 安装程序可以从here下载。

MathWorks还提供许可产品,试用版和学生版。 您需要登录该站点并等待一点他们的批准。

下载安装程序后,只需点击几下即可安装软件。

在线安装MATLAB

安装

了解MATLAB环境

可以从桌面上创建的图标启动MATLAB开发IDE。 MATLAB中的主要工作窗口称为桌面。 启动MATLAB时,桌面将以默认布局显示 -

MATLAB桌面

桌面有以下面板 -

  • Current Folder - 此面板允许您访问项目文件夹和文件。

  • 当前文件夹
  • Command Window - 这是可以在命令行输入命令的主要区域。 它由命令提示符(“”)表示。

  • 命令窗口
  • Workspace - 工作空间显示从文件创建和/或导入的所有变量。

  • 工作区
  • Command History - 此面板显示或返回在命令行输入的命令。

  • 命令历史

设置GNU Octave

如果您愿意在您的机器上使用Octave(Linux,BSD,OS X或Windows),请从下载GNU Octave下载最新版本。 您可以查看机器的给定安装说明。

MATLAB - Basic Syntax

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

MATLAB是一个解释环境。 换句话说,你给出一个命令,MATLAB立即执行它。

动手实践

输入有效的表达式,例如,

5 + 5

然后按ENTER键

单击“执行”按钮或键入Ctrl + E时,MATLAB立即执行它,返回的结果为 -

ans = 10

让我们再举几个例子 -

3 ^ 2	       % 3 raised to the power of 2

单击“执行”按钮或键入Ctrl + E时,MATLAB立即执行它,返回的结果为 -

ans = 9

另一个例子,

sin(pi /2)	  % sine of angle 90<sup>o</sup>

单击“执行”按钮或键入Ctrl + E时,MATLAB立即执行它,返回的结果为 -

ans = 1

另一个例子,

7/0		      % Divide by zero

单击“执行”按钮或键入Ctrl + E时,MATLAB立即执行它,返回的结果为 -

ans = Inf
warning: division by zero

另一个例子,

732 * 20.3	

单击“执行”按钮或键入Ctrl + E时,MATLAB立即执行它,返回的结果为 -

ans =  1.4860e+04

MATLAB为一些数学符号提供了一些特殊的表达式,例如pi表示π,Inf表示∞,i(和j)表示√-1等Nan表示“非数字”。

在MATLAB中使用分号(;)

分号(;)表示结束语句。 但是,如果要抑制和隐藏表达式的MATLAB输出,请在表达式后添加分号。

例如,

x = 3;
y = x + 5

单击“执行”按钮或键入Ctrl + E时,MATLAB立即执行它,返回的结果为 -

y =  8

添加评论

百分比符号(%)用于表示注释行。 例如,

x = 9	     % assign the value 9 to x

您还可以使用块注释运算符%{和%}编写注释块。

MATLAB编辑器包含工具和上下文菜单项,可帮助您添加,删除或更改注释的格式。

常用的操作符和特殊字符

MATLAB支持以下常用运算符和特殊字符 -

操作者 目的
+ 加; 加法运算符。
- 减去; 减法运算符。
* 标量和矩阵乘法运算符。
.* 数组乘法运算符。
^ 标量和矩阵求幂运算符。
.^ 数组取幂运算符。
\ 左分区算子。
/ 右分算子。
.\ 数组左除运算符。
./ 数组右分算子。
: 结肠; 生成规则间隔的元素并表示整个行或列。
( ) 括弧; 包含函数参数和数组索引; 覆盖优先权。
[ ] 括号; 附件数组元素。
. 小数点。
省略; 线继续运算符
, 逗号; 分隔行中的语句和元素
; 分号; 分隔列并抑制显示。
% 百分号; 指定注释并指定格式。
_ 引用标志和转置运算符。
._ 非共轭转置算子。
= 分配运算符。

特殊变量和常量

MATLAB支持以下特殊变量和常量 -

名称 含义
ans 最近的回答。
eps 浮点精度的准确性。
i,j 假想单位√-1。
Inf Infinity.
NaN 未定义的数值结果(不是数字)。
pi 数字π

命名变量 (Naming Variables)

变量名称由一个字母后跟任意数量的字母,数字或下划线组成。

MATLAB case-sensitive

变量名称可以是任意长度,但是,MATLAB仅使用前N个字符,其中N由函数namelengthmax

拯救你的工作

save命令用于将当前目录中工作空间中的所有变量保存为扩展名为.mat的文件。

例如,

save myfile

您可以稍后使用load命令重新加载文件。

load myfile

MATLAB - Variables

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

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

x = 3	       % defining x and initializing it with a value

MATLAB将执行上述语句并返回以下结果 -

x = 3

它创建一个名为x的1 x 1矩阵,并将值3存储在其元素中。 让我们看另一个例子,

x = sqrt(16) 	% defining x and initializing it with an expression

MATLAB将执行上述语句并返回以下结果 -

x = 4

请注意 -

  • 将变量输入系统后,您可以稍后再参考。

  • 变量在使用前必须具有值。

  • 当表达式返回未分配给任何变量的结果时,系统会将其分配给名为ans的​​变量,该变量可在以后使用。

例如,

sqrt(78)

MATLAB将执行上述语句并返回以下结果 -

ans =  8.8318

你可以使用这个变量ans -

sqrt(78);
9876/ans

MATLAB将执行上述语句并返回以下结果 -

ans =  1118.2

让我们看看另一个例子 -

x = 7 * 8;
y = x * 7.89

MATLAB将执行上述语句并返回以下结果 -

y =  441.84

多项任务

您可以在同一行上进行多项分配。 例如,

a = 2; b = 7; c = a * b

MATLAB将执行上述语句并返回以下结果 -

c = 14

我忘记了变量!

who命令显示您使用的所有变量名称。

who

MATLAB将执行上述语句并返回以下结果 -

Your variables are:
a    ans  b    c   

whos命令显示有关变量的更多信息 -

  • 变量目前在内存中
  • 每个变量的类型
  • 分配给每个变量的内存
  • 它们是否是复杂的变量
whos

MATLAB将执行上述语句并返回以下结果 -

Attr Name        Size        Bytes      Class
==== ====        ====        ====       ===== 
   a             1x1           8        double
   ans           1x70         757        cell
   b             1x1           8        double
   c             1x1           8        double
Total is 73 elements using 781 bytes     

clear命令从内存中删除所有(或指定的)变量。

clear x     % it will delete x, won't display anything
clear       % it will delete all variables in the workspace
            %  peacefully and unobtrusively 

长期任务

通过使用省略号(...),可以将长分配扩展到另一行。 例如,

initial_velocity = 0;
acceleration = 9.8;
time = 20;
final_velocity = initial_velocity + acceleration * time

MATLAB将执行上述语句并返回以下结果 -

final_velocity = 196

The format Command

默认情况下,MATLAB显示带有四个小数位值的数字。 这称为short format

但是,如果需要更高的精度,则需要使用format命令。

format long命令显示十进制后的16位数。

例如 -

format long
x = 7 + 10/3 + 5 ^ 1.2

MATLAB将执行上述声明并返回以下结果 -

x = 17.2319816406394

另一个例子,

format short
x = 7 + 10/3 + 5 ^ 1.2

MATLAB将执行上述语句并返回以下结果 -

x = 17.232

format bank命令将数字四舍五入到小数点后两位。 例如,

format bank
daily_wage = 177.45;
weekly_wage = daily_wage * 6

MATLAB将执行上述语句并返回以下结果 -

weekly_wage = 1064.70

MATLAB使用指数表示法显示大数字。

format short e命令允许以指数形式显示四位小数加指数。

例如,

format short e
4.678 * 4.9

MATLAB将执行上述语句并返回以下结果 -

ans = 2.2922e+01

format long e命令允许以指数形式显示四位小数加指数。 例如,

format long e
x = pi

MATLAB将执行上述语句并返回以下结果 -

x = 3.141592653589793e+00

format rat命令给出了计算得到的最接近的理性表达式。 例如,

format rat
4.678 * 4.9

MATLAB将执行上述语句并返回以下结果 -

ans = 34177/1491 

创建矢量

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

  • 行向量
  • 列向量

通过将元素集括在方括号中,使用空格或逗号分隔元素来创建Row vectors

例如,

r = [7 8 9 10 11]

MATLAB将执行上述语句并返回以下结果 -

r =
   7    8    9   10   11 

另一个例子,

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

MATLAB将执行上述语句并返回以下结果 -

res =
         9         11         13         15         17

通过将元素集括在方括号中来创建Column vectors ,使用分号(;)来分隔元素。

c = [7;  8;  9;  10; 11]

MATLAB将执行上述语句并返回以下结果 -

c =
       7       
       8       
       9       
      10       
      11  

创建矩阵

矩阵是二维数字数组。

在MATLAB中,通过将每一行输入为空格序列或逗号分隔元素来创建矩阵,并以分号划分行的末尾。 例如,让我们创建一个3乘3的矩阵 -

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

MATLAB将执行上述语句并返回以下结果 -

m =
       1              2              3       
       4              5              6       
       7              8              9       

MATLAB - Commands

MATLAB是一个用于数值计算和数据可视化的交互式程序。 您可以在Command Window的MATLAB提示符“>>”中键入命令来输入Command Window

在本节中,我们将提供常用的常规MATLAB命令列表。

用于管理会话的命令

MATLAB提供了用于管理会话的各种命令。 下表提供了所有这些命令 -

命令 目的
clc 清除命令窗口。
clear 从内存中删除变量。
exist 检查文件或变量是否存在。
global 声明变量是全局变量。
help 搜索帮助主题。
lookfor 搜索关键字的帮助条目。
quit 停止MATLAB。
who 列出当前变量。
whos 列出当前变量(长显示)。

使用系统的命令

MATLAB提供了各种用于处理系统的有用命令,例如将工作空间中的当前工作保存为文件并稍后加载文件。

它还为其他与系统相关的活动提供各种命令,如显示日期,列出目录中的文件,显示当前目录等。

下表显示了一些常用的系统相关命令 -

命令 目的
cd 更改当前目录。
date 显示当前日期。
delete 删除文件。
diary 打开/关闭日记文件记录。
dir 列出当前目录中的所有文件。
load 从文件加载工作空间变量。
path 显示搜索路径。
pwd 显示当前目录。
save 将工作空间变量保存在文件中。
type 显示文件的内容。
what 列出当前目录中的所有MATLAB文件。
wklread 读取.wk1电子表格文件。

Input and Output Commands

MATLAB提供以下输入和输出相关命令 -

命令 目的
disp 显示数组或字符串的内容。
fscanf 从文件中读取格式化数据。
format 控制屏幕显示格式。
fprintf 执行格式化写入屏幕或文件。
input 显示提示并等待输入。
; 禁止丝网印刷。

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

格式代码 目的
%s 格式化为字符串。
%d 格式为整数。
%f 格式化为浮点值。
%e 格式化为科学计数法中的浮点值。
%g 格式最紧凑:%f或%e。
\n 在输出字符串中插入新行。
\t 在输出字符串中插入选项卡。

格式化功能具有以下用于数字显示的形式 -

格式功能 显示最多
格式短 四位十进制数字(默认)。
格式长 16位十进制数。
格式短e 五位加指数。
格式长e 16位数加上指数。
格式银行 两位小数。
格式+ 正面,负面或零。
格式鼠 理性近似。
格式紧凑 抑制一些换行。
格式松散 重置为不太紧凑的显示模式。

矢量,矩阵和数组命令

下表显示了用于处理数组,矩阵和向量的各种命令 -

命令 目的
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 标识单元格数组。

Plotting Commands

MATLAB提供了许多用于绘制图形的命令。 下表显示了一些常用的绘图命令 -

命令 目的
axis 设置轴限制。
fplot 智能绘图功能。
grid 显示网格线。
plot 生成xy图。
print 打印绘图或将绘图保存到文件。
title 将文字放在图的顶部。
xlabel 将文本标签添加到x轴。
ylabel 将文本标签添加到y轴。
axes 创建轴对象。
close 关闭当前的情节。
关闭所有 关闭所有情节。
figure 打开一个新的数字窗口。
gtext 通过鼠标启用标签放置。
hold 冻结当前的情节。
legend 通过鼠标放置图例。
refresh 重绘当前图形窗口。
set 指定轴等对象的属性。
subplot 在子窗口中创建绘图。
text 在图中放置字符串。
bar 创建条形图。
loglog 创建对数日志图。
polar 创造极地情节。
semilogx 创建semilog图。 (对数横坐标)。
semilogy 创建semilog图。 (对数坐标)。
stairs 创建楼梯情节。
stem 创建词干图。

MATLAB - M-Files

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

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

M档案

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

  • Scripts - 脚本文件是.m extension程序文件。 在这些文件中,您可以编写一系列要一起执行的命令。 脚本不接受输入,也不返回任何输出。 它们对工作空间中的数据进行操作。

  • Functions - 函数文件也是.m extension程序文件。 函数可以接受输入和返回输出。 内部变量是函数的本地变量。

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

创建和运行脚本文件

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

  • 使用命令提示符
  • 使用IDE

如果使用命令提示符,请在命令提示符下键入edit 。 这将打开编辑器。 您可以直接输入edit ,然后输入文件名(扩展名为.m)

edit 
Or
edit <filename>

上面的命令将在默认的MATLAB目录中创建该文件。 如果要将所有程序文件存储在特定文件夹中,则必须提供整个路径。

让我们创建一个名为progs的文件夹。 在命令提示符下键入以下命令(>>) -

mkdir progs    % create directory progs under default directory
chdir progs    % changing the current directory to progs
edit  prog1.m  % creating an m file named prog1.m

如果您是第一次创建文件,MATLAB会提示您确认。 单击是。

创建脚本文件

或者,如果您使用的是IDE,请选择NEW - > Script。 这也会打开编辑器并创建一个名为Untitled的文件。 输入代码后,您可以命名并保存文件。

在编辑器中键入以下代码 -

NoOfStudents = 6000;
TeachingStaff = 150;
NonTeachingStaff = 20;
Total = NoOfStudents + TeachingStaff ...
   + NonTeachingStaff;
disp(Total);

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

  • 单击编辑器窗口上的“ Run按钮或

  • 只需在命令提示符下键入文件名(不带扩展名):>> prog1

命令窗口提示显示结果 -

6170

例子 (Example)

创建一个脚本文件,然后键入以下代码 -

a = 5; b = 7;
c = a + b
d = c + sin(b)
e = 5 * d
f = exp(-d)

编译并执行上述代码时,会产生以下结果 -

c =  12
d =  12.657
e =  63.285
f =    3.1852e-06

MATLAB - Data Types

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

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

例如,

Total = 42

上面的语句创建了一个名为“Total”的1×1矩阵,并将值42存储在其中。

MATLAB中可用的数据类型

MATLAB提供15种基本数据类型。 每种数据类型都存储矩阵或数组形式的数据。 该矩阵或数组的大小最小为0乘0,这可以增长到任何大小的矩阵或数组。

下表显示了MATLAB中最常用的数据类型 -

Sr.No. 数据类型和描述
1

int8

8位有符号整数

2

uint8

8位无符号整数

3

int16

16位有符号整数

4

uint16

16位无符号整数

5

int32

32位有符号整数

6

uint32

32位无符号整数

7

int64

64位有符号整数

8

uint64

64位无符号整数

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类构造的对象

例子 (Example)

使用以下代码创建脚本文件 -

str = 'Hello World!'
n = 2345
d = double(n)
un = uint32(789.50)
rn = 5678.92347
c = int32(rn)

编译并执行上述代码时,会产生以下结果 -

str = Hello World!
n =  2345
d =  2345
un = 790
rn = 5678.9
c =  5679

数据类型转换

MATLAB提供了各种函数,用于将值从一种数据类型转换为另一种数据类型。 下表显示了数据类型转换函数 -

功能 目的
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 将结构转换为单元格数组

确定数据类型

MATLAB提供了各种用于识别变量数据类型的函数。

下表提供了确定变量数据类型的函数 -

功能 目的
is 检测状态
isa 确定输入是否是指定类的对象
iscell 确定输入是否是单元格数组
iscellstr 确定输入是否是字符串的单元格数组
ischar 确定项是否为字符数组
isfield 确定输入是否为结构数组字段
isfloat 确定输入是否为浮点数组
ishghandle 对于Handle Graphics对象句柄为True
isinteger 确定输入是否为整数数组
isjava 确定输入是否为Java对象
islogical 确定输入是否为逻辑数组
isnumeric 确定输入是否为数字数组
isobject 确定输入是否为MATLAB对象
isreal 检查输入是否为实数组
isscalar 确定输入是否是标量
isstr 确定输入是否为字符数组
isstruct 确定输入是否为结构数组
isvector 确定输入是否为矢量
class 确定对象的类
validateattributes 检查数组的有效性
whos 列出工作空间中的变量,包括大小和类型

例子 (Example)

使用以下代码创建脚本文件 -

x = 3
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)
x = 23.54
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)
x = [1 2 3]
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
x = 'Hello'
isinteger(x)
isfloat(x)
isvector(x)
isscalar(x)
isnumeric(x)

运行该文件时,它会产生以下结果 -

x = 3
ans = 0
ans = 1
ans = 1
ans = 1
ans = 1
x = 23.540
ans = 0
ans = 1
ans = 1
ans = 1
ans = 1
x =
          1          2          3
ans = 0
ans = 1
ans = 1
ans = 0
x = Hello
ans = 0
ans = 0
ans = 1
ans = 0
ans = 0

MATLAB - Operators

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

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 按位操作
  • 设置操作

算术运算符 (Arithmetic Operators)

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

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

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

矩阵运算符和数组运算符由句点(。)符号区分。 但是,由于矩阵和数组的加法和减法操作相同,因此两种情况下的运算符相同。 下表给出了运算符的简要说明 -

显示示例

Sr.No. 操作符和说明
1

+

加或一元加。 A + B添加存储在变量A和B中的值.A和B必须具有相同的大小,除非一个是标量。 标量可以添加到任何大小的矩阵中。

2

-

减法或一元减号。 AB从A中减去B的值.A和B必须具有相同的大小,除非一个是标量。 可以从任何大小的矩阵中减去标量。

3

*

矩阵乘法。 C = A * B是矩阵A和B的线性代数乘积。更准确地说,

矩阵乘法

对于非标量A和B,A的列数必须等于B的行数。标量可以乘以任意大小的矩阵。

4

.*

数组乘法。 A. * B是数组A和B的逐元素乘积.A和B必须具有相同的大小,除非其中一个是标量。

5

/

斜线或矩阵右划分。 B/A与B * inv(A)大致相同。 更准确地说,B/A =(A'\ B')'。

6

./

数组右分裂。 A./B是具有元素A(i,j)/ B(i,j)的矩阵。 A和B必须具有相同的大小,除非其中一个是标量。

7

\

反斜杠或矩阵左分裂。 如果A是方阵,则A\B与inv(A)* B大致相同,除非它以不同的方式计算。 如果A是n×n矩阵,B是具有n个分量的列向量,或者是具有多个这样的列的矩阵,则X = A\B是等式AX = B的解。 如果A严重缩放或几乎是单数,则会显示警告消息。

8

.\

数组左分裂。 A.\B是具有元素B(i,j)/ A(i,j)的矩阵。 A和B必须具有相同的大小,除非其中一个是标量。

9

^

矩阵功率。 如果p是标量,则X ^ p是幂p的X. 如果p是整数,则通过重复平方来计算功率。 如果整数为负,则首先反转X. 对于p的其他值,计算涉及特征值和特征向量,使得如果[V,D] = eig(X),则X ^ p = V * D. ^ p/V.

10

.^

阵列功率。 A. ^ B是具有元素A(i,j)到B(i,j)幂的矩阵。 A和B必须具有相同的大小,除非其中一个是标量。

11

'

矩阵转置。 A'是A的线性代数转置。对于复数矩阵,这是复共轭转置。

12

.'

数组转置。 一个。' 是A的数组转置。对于复数矩阵,这不涉及共轭。

关系运算符 (Relational Operators)

关系运算符也可以处理标量和非标量数据。 数组的关系运算符执行两个数组之间的逐个元素比较,并返回相同大小的逻辑数组,其中元素设置为逻辑1(true),其中关系为true,元素设置为逻辑0(false),其中不。

下表显示了MATLAB中可用的关系运算符 -

显示示例

Sr.No. 操作符和说明
1

<

Less than

2

《=

小于或等于

3

>

Greater than

4

》=

大于或等于

5

==

等于

6

~=

不等于

逻辑运算符 (Logical Operators)

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

  • 元素 - 这些运算符在逻辑数组的相应元素上运行。

  • 短路 - 这些运算符以标量和逻辑表达式运行。

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

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

显示示例

按位操作

按位运算符处理位并执行逐位运算。 &,|和^的真值表如下 -

p q p&q p | q p ^ q
00000
01011
11110
10011

假设A = 60; 和B = 13; 现在采用二进制格式,它们如下 -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A | B = 0011 1101

A ^ B = 0011 0001

~A = 1100 0011

MATLAB为逐位操作提供了各种功能,如“按位和”,“按位”或“按位非”操作,移位操作等。

下表显示了常用的按位操作 -

显示示例

功能 目的
bitand(a, b) 按位和整数ab
bitcmp(a) a逐位补充
bitget(a,pos) 在整数数组a获取指定位置pos
bitor(a, b) 整数ab位OR
bitset(a, pos) 在a的特定位置pos处设置位
bitshift(a, k) 返回向左移位k位,相当于乘以2 k 。 k的负值对应于向右移位或除以2 | k | 并舍入到最接近负整数的整数。 任何溢出位都被截断。
bitxor(a, b) 整数ab逐位异或
swapbytes 交换字节顺序

设置操作

MATLAB为集合操作提供了各种功能,例如联合,交集和集合成员资格的测试等。

下表显示了一些常用的集合操作 -

显示示例

Sr.No. 功能说明
1

intersect(A,B)

设置两个数组的交集; 返回A和B共有的值。返回的值按排序顺序排列。

2

intersect(A,B,'rows')

将A的每一行和B的每一行视为单个实体,并返回A和B共同的行。返回矩阵的行按排序顺序排列。

3

ismember(A,B)

返回一个与A大小相同的数组,包含1(true),其中A的元素在B中找到。在其他地方,它返回0(false)。

4

ismember(A,B,'rows')

将A的每一行和B的每一行视为单个实体,并返回包含1(true)的向量,其中矩阵A的行也是B的行。否则,它返回0(false)。

5

issorted(A)

如果A的元素按排序顺序返回逻辑1(true),否则返回逻辑0(false)。 输入A可以是矢量或N×1或1×N的字符串数组。 A is considered to be sorted if A和sort(A)的输出相等, A is considered to be sorted if A

6

issorted(A, 'rows')

如果二维矩阵A的行按排序顺序返回逻辑1(真),否则返回逻辑0(假)。 Matrix A is considered to be sorted if A和sortrows(A)的输出相等, Matrix A is considered to be sorted if A

7

setdiff(A,B)

设置两个数组的差异; 返回A中不在B中的值。返回数组中的值按排序顺序排列。

8

setdiff(A,B,'rows')

将A的每一行和B的每一行视为单个实体,并返回A中不在B中的行。返回矩阵的行按排序顺序排列。

'rows'选项不支持单元格数组。

9

setxor

设置两个数组的异或

10

union

设置两个数组的并集

11

unique

数组中的唯一值

MATLAB - Decision Making

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

以下是大多数编程语言中常见决策结构的一般形式 -

MATLAB中的决策报表

MATLAB提供以下类型的决策制定声明。 点击以下链接查看其详细信息 -

Sr.No. 声明和说明
1 if ... end statement

if ... end statement由一个布尔表达式后跟一个或多个语句组成。

2 if...else...end statement

if statement后面可以跟一个可选的else statement ,该else statement在布尔表达式为false时执行。

3 如果... elseif ... elseif ... else ...结束语句

if语句后面可以跟一个(或多个)可选的elseif...else语句,这对于测试各种条件非常有用。

4 嵌套if语句

您可以在另一个ifelseif语句中使用ifelseif语句。

5 switch 语句

switch语句允许测试变量与值列表的相等性。

6 嵌套的switch语句

您可以在另一个switch语句中使用一个switch语句。

MATLAB - Loop Types

可能存在需要多次执行代码块的情况。 通常,语句按顺序执行。 首先执行函数中的第一个语句,然后执行第二个语句,依此类推。

编程语言提供各种控制结构,允许更复杂的执行路径。

循环语句允许我们多次执行语句或语句组,以下是大多数编程语言中循环语句的一般形式 -

循环架构

MATLAB提供以下类型的循环来处理循环要求。 点击以下链接查看其详细信息 -

Sr.No. 循环类型和描述
1 循环

在给定条件为真时重复语句或语句组。 它在执行循环体之前测试条件。

2 for循环

多次执行一系列语句,并缩写管理循环变量的代码。

3 嵌套循环

您可以在任何其他循环中使用一个或多个循环。

循环控制语句 (Loop Control Statements)

循环控制语句将执行从其正常序列更改。 当执行离开作用域时,将销毁在该作用域中创建的所有自动对象。

MATLAB支持以下控制语句。 单击以下链接以检查其详细信息。

Sr.No. 控制声明和描述
1 break statement

终止loop语句并将执行转移到loop语句。

2 continue statement

导致循环跳过其身体的其余部分,并在重复之前立即重新测试其状态。

MATLAB - Vectors

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

  • 行向量
  • 列向量

行向量

通过将元素集括在方括号中,使用空格或逗号分隔元素来创建Row vectors

r = [7 8 9 10 11]

MATLAB将执行上述语句并返回以下结果 -

r =
   7    8    9   10   11 

列向量

通过将元素集括在方括号中来创建Column vectors ,使用分号来分隔元素。

c = [7;  8;  9;  10; 11]

MATLAB将执行上述语句并返回以下结果 -

c =
      7       
      8       
      9       
      10       
      11  

引用向量的元素

您可以通过多种方式引用向量的一个或多个元素。 矢量v的第i 分量称为v(i)。 例如 -

v = [ 1; 2; 3; 4; 5; 6];	% creating a column vector of 6 elements
v(3)

MATLAB将执行上述语句并返回以下结果 -

ans =  3

当您引用带冒号的向量(例如v(:))时,会列出向量的所有组件。

v = [ 1; 2; 3; 4; 5; 6];	% creating a column vector of 6 elements
v(:)

MATLAB将执行上述语句并返回以下结果 -

ans =
     1
     2
     3
     4
     5
     6

MATLAB允许您从矢量中选择一系列元素。

例如,让我们创建一个包含9个元素的行向量rv ,然后我们将通过编写rv(3:7)来引用元素3到7,并创建一个名为sub_rv的新向量。

rv = [1 2 3 4 5 6 7 8 9];
sub_rv = rv(3:7)

MATLAB将执行上述语句并返回以下结果 -

sub_rv =
   3   4   5   6   7

矢量运算

在本节中,让我们讨论以下向量操作 -

MATLAB - Matrix

矩阵是二维数字数组。

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

例如,让我们创建一个4乘5的矩阵a -

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

MATLAB将执行上述语句并返回以下结果 -

a =
      1     2     3     4     5
      2     3     4     5     6
      3     4     5     6     7
      4     5     6     7     8

引用矩阵的元素

为了引用矩阵mx m行和 n列中的元素,我们写 -

mx(m, n);

例如,要引用矩阵a 2行和 5列中的元素,如上一节中所创建的,我们键入 -

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

MATLAB将执行上述语句并返回以下结果 -

ans =  6

要引用第m列中的所有元素,我们键入A(:,m)。

让我们从矩阵的 4行的元素创建一个列向量v -

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
v = a(:,4)

MATLAB将执行上述语句并返回以下结果 -

v =
      4
      5
      6
      7

您也可以选择第m列到 n列中的元素,为此我们写 -

a(:,m:n)

让我们创建一个较小的矩阵,从第二列和第三列中获取元素 -

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(:, 2:3)

MATLAB将执行上述语句并返回以下结果 -

ans =
      2     3
      3     4
      4     5
      5     6

以同样的方式,您可以创建一个子矩阵,采用矩阵的子部分。

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(:, 2:3)

MATLAB将执行上述语句并返回以下结果 -

ans =
      2     3
      3     4
      4     5
      5     6

以同样的方式,您可以创建一个子矩阵,采用矩阵的子部分。

例如,让我们创建一个子矩阵sa取一个内部子部分 -

3     4     5     
4     5     6     

要做到这一点,写 -

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
sa = a(2:3,2:4)

MATLAB将执行上述语句并返回以下结果 -

sa =
      3     4     5
      4     5     6

删除矩阵中的行或列

您可以通过为该行或列分配一组空方括号[]来删除矩阵的整行或列。 基本上,[]表示一个空数组。

例如,让我们删除第四行 -

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a( 4 , : ) = []

MATLAB将执行上述语句并返回以下结果 -

a =
      1     2     3     4     5
      2     3     4     5     6
      3     4     5     6     7

接下来,让我们删除第五列 -

a = [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8];
a(: , 5)=[]

MATLAB将执行上述语句并返回以下结果 -

a =
      1     2     3     4
      2     3     4     5
      3     4     5     6
      4     5     6     7

例子 (Example)

在这个例子中,让我们创建一个3乘3的矩阵m,然后我们将复制该矩阵的第二行和第三行两次以创建一个4乘3的矩阵。

使用以下代码创建脚本文件 -

a = [ 1 2 3 ; 4 5 6; 7 8 9];
new_mat = a([2,3,2,3],:)

运行该文件时,它显示以下结果 -

new_mat =
      4     5     6
      7     8     9
      4     5     6
      7     8     9

矩阵运算

在本节中,我们将讨论以下基本和常用的矩阵运算 -

MATLAB - Arrays

MATLAB中所有数据类型的所有变量都是多维数组。 矢量是一维阵列,矩阵是二维阵列。

我们已经讨论了向量和矩阵。 在本章中,我们将讨论多维数组。 但是,在此之前,让我们讨论一些特殊类型的数组。

MATLAB中的特殊数组

在本节中,我们将讨论一些创建一些特殊数组的函数。 对于所有这些函数,单个参数创建一个正方形数组,双参数创建矩形数组。

zeros()函数创建一个全零的数组 -

例如 -

zeros(5)

MATLAB将执行上述语句并返回以下结果 -

ans =
      0     0     0     0     0
      0     0     0     0     0
      0     0     0     0     0
      0     0     0     0     0
      0     0     0     0     0

ones()函数创建所有的数组 -

例如 -

ones(4,3)

MATLAB将执行上述语句并返回以下结果 -

ans =
      1     1     1
      1     1     1
      1     1     1
      1     1     1

eye()函数创建一个单位矩阵。

例如 -

eye(4)

MATLAB将执行上述语句并返回以下结果 -

ans =
      1     0     0     0
      0     1     0     0
      0     0     1     0
      0     0     0     1

rand()函数在(0,1)上创建一个均匀分布的随机数数组 -

例如 -

rand(3, 5)

MATLAB将执行上述语句并返回以下结果 -

ans =
   0.8147    0.9134    0.2785    0.9649    0.9572
   0.9058    0.6324    0.5469    0.1576    0.4854
   0.1270    0.0975    0.9575    0.9706    0.8003

一个魔术广场

magic square是一个正方形,当它的元素按行,列或对角添加时,它产生相同的总和。

magic()函数创建一个魔术方阵。 它需要一个单一的参数来给出正方形的大小。 参数必须是大于或等于3的标量。

magic(4)

MATLAB将执行上述语句并返回以下结果 -

ans =
   16     2     3    13
   5    11    10     8
   9     7     6    12
   4    14    15     1

多维数组

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

通常,为了生成多维数组,我们首先创建一个二维数组并对其进行扩展。

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

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

MATLAB将执行上述语句并返回以下结果 -

a =
   7     9     5
   6     1     9
   4     3     2

阵列a是3乘3阵列; 我们可以通过提供像 - 的值来为a添加第三个维度

a(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]

MATLAB将执行上述语句并返回以下结果 -

a =
ans(:,:,1) =
   0   0   0
   0   0   0
   0   0   0
ans(:,:,2) =
   1   2   3
   4   5   6
   7   8   9

我们还可以使用ones(),zeros()或rand()函数创建多维数组。

例如,

b = rand(4,3,2)

MATLAB将执行上述语句并返回以下结果 -

b(:,:,1) =
   0.0344    0.7952    0.6463
   0.4387    0.1869    0.7094
   0.3816    0.4898    0.7547
   0.7655    0.4456    0.2760
b(:,:,2) =
   0.6797    0.4984    0.2238
   0.6551    0.9597    0.7513
   0.1626    0.3404    0.2551
   0.1190    0.5853    0.5060

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

cat()函数的语法是 -

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

Where,

  • B是创建的新数组

  • A1A2 ,...是要连接的数组

  • dim是连接数组的维度

例子 (Example)

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

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])

当您运行该文件时,它显示 -

c(:,:,1) =
      9     8     7
      6     5     4
      3     2     1
c(:,:,2) =
      1     2     3
      4     5     6
      7     8     9
c(:,:,3) =
      2     3     1
      4     7     8
      3     9     0

Array 函数

MATLAB提供以下功能来排序,旋转,置换,重塑或移位数组内容。

功能 目的
length 矢量长度或最大阵列尺寸
ndims 数组维数
numel 数组元素的数量
size 数组尺寸
iscolumn 确定输入是否为列向量
isempty 确定数组是否为空
ismatrix 确定输入是否为矩阵
isrow 确定输入是否为行向量
isscalar 确定输入是否是标量
isvector 确定输入是否为矢量
blkdiag 根据输入参数构造块对角矩阵
circshift 循环移位阵列
ctranspose 复共轭转置
diag 矩阵的对角矩阵和对角线
flipdim 沿指定维度翻转数组
fliplr 从左到右翻转矩阵
flipud 将矩阵翻转到最低点
ipermute 逆变换ND阵列的尺寸
permute 重新排列ND阵列的尺寸
repmat 复制和平铺数组
reshape 重塑阵列
rot90 将矩阵旋转90度
shiftdim 换档尺寸
issorted 确定集合元素是否按排序顺序排列
sort 按升序或降序对数组元素进行排序
sortrows 按升序对行进行排序
squeeze 删除单个尺寸
transposeTranspose
vectorize 矢量化表达

例子 (Examples)

以下示例说明了上面提到的一些功能。

Length, Dimension and Number of elements −

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

x = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9];
length(x)      % length of x vector
y = rand(3, 4, 5, 2);
ndims(y)       % no of dimensions in array y
s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab'];
numel(s)       % no of elements in s

运行该文件时,它显示以下结果 -

ans =  8
ans =  4
ans =  23

Circular Shifting of the Array Elements −

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

a = [1 2 3; 4 5 6; 7 8 9]  % the original array a
b = circshift(a,1)         %  circular shift first dimension values down by 1.
c = circshift(a,[1 -1])    % circular shift first dimension values % down by 1 
                           % and second dimension values to the left % by 1.

运行该文件时,它显示以下结果 -

a =
   1     2     3
   4     5     6
   7     8     9
b =
   7     8     9
   1     2     3
   4     5     6
c =
   8     9     7
   2     3     1
   5     6     4

排序数组

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

v = [ 23 45 12 9 5 0 19 17]  % horizontal vector
sort(v)                      % sorting v
m = [2 6 4; 5 3 9; 2 0 1]    % two dimensional array
sort(m, 1)                   % sorting m along the row
sort(m, 2)                   % sorting m along the column

运行该文件时,它显示以下结果 -

v =
   23    45    12     9     5     0    19    17
ans =
   0     5     9    12    17    19    23    45
m =
   2     6     4
   5     3     9
   2     0     1
ans =
   2     0     1
   2     3     4
   5     6     9
ans =
   2     4     6
   3     5     9
   0     1     2

细胞阵列

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

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

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

Where,

  • C是单元阵列;

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

  • dim1, ... , dimN是指定C的维数的标量整数;

  • obj是以下之一 -

    • Java数组或对象
    • System.String或System.Object类型的.NET数组

例子 (Example)

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

c = cell(2, 5);
c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}

运行该文件时,它显示以下结果 -

c = 
{
   [1,1] = Red
   [2,1] =  1
   [1,2] = Blue
   [2,2] =  2
   [1,3] = Green
   [2,3] =  3
   [1,4] = Yellow
   [2,4] =  4
   [1,5] = White
   [2,5] =  5
}

访问单元格数组中的数据

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

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

将索引括在第一个括号中时,它指的是一组单元格。

平滑括号中的单元阵列索引指的是单元组。

例如 -

c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c(1:2,1:2)

MATLAB将执行上述语句并返回以下结果 -

ans = 
{
   [1,1] = Red
   [2,1] =  1
   [1,2] = Blue
   [2,2] =  2
}

您还可以通过使用花括号索引来访问单元格的内容。

例如 -

c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5};
c{1, 2:4}

MATLAB将执行上述语句并返回以下结果 -

ans = Blue
ans = Green
ans = Yellow

MATLAB - Colon Notation

colon(:)是MATLAB中最有用的运算符之一。 它用于创建向量,下标数组和specify for iterations

如果你想创建一个包含1到10整数的行向量,你可以写 -

1:10

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

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

如果要指定除1之外的增量值,例如 -

100: -5: 50

MATLAB执行该语句并返回以下结果 -

ans =
   100    95    90    85    80    75    70    65    60    55    50

让我们再看一个例子 -

0:pi/8:pi

MATLAB执行该语句并返回以下结果 -

ans =
   Columns 1 through 7
      0    0.3927    0.7854    1.1781    1.5708    1.9635    2.3562
   Columns 8 through 9
      2.7489    3.1416

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

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

格式 目的
A(:,j) 是A的第j列。
A(i,:) 是第i排A.
A(:,:) 是等效的二维数组。 对于矩阵,这与A相同。
A(j:k) 是A(j),A(j + 1),...,A(k)。
A(:,j:k) 是A(:,j),A(:,j + 1),...,A(:,k)。
A(:,:,k) 是三维数组A的第k页。
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相同数量的元素。

例子 (Example)

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

A = [1 2 3 4; 4 5 6 7; 7 8 9 10]
A(:,2)      % second column of A
A(:,2:3)    % second and third column of A
A(2:3,2:3)  % second and third rows and second and third columns

运行该文件时,它显示以下结果 -

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

MATLAB - Numbers

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

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

所有数字类型都支持基本数组操作和数学运算。

转换为各种数字数据类型

MATLAB提供以下函数来转换为各种数字数据类型 -

功能 目的
double 转换为双精度数
single 转换为单精度数
int8 转换为8位有符号整数
int16 转换为16位有符号整数
int32 转换为32位有符号整数
int64 转换为64位有符号整数
uint8 转换为8位无符号整数
uint16 转换为16位无符号整数
uint32 转换为32位无符号整数
uint64 转换为64位无符号整数

例子 (Example)

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

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

运行该文件时,它显示以下结果 -

x =
   39.900   26.025   47.100
x =
   39.900   26.025   47.100
x =
   38  23  45
x =
   38  23  45
x =
   38  23  45
x =
   38  23  45

例子 (Example)

让我们再扩展前面的例子。 创建一个脚本文件并键入以下代码 -

x = int32([5.32 3.47 6.28]) .* 7.5
x = int64([5.32 3.47 6.28]) .* 7.5
x = num2cell(x)

运行该文件时,它显示以下结果 -

x =
   38  23  45
x =
   38  23  45
x = 
{
   [1,1] = 38
   [1,2] = 23
   [1,3] = 45
}

最小和最大的整数

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

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

例子 (Example)

以下示例说明如何获取最小和最大的整数值。 创建一个脚本文件并在其中编写以下代码 -

% displaying the smallest and largest signed integer data
str = 'The range for int8 is:\n\t%d to %d ';
sprintf(str, intmin('int8'), intmax('int8'))
str = 'The range for int16 is:\n\t%d to %d ';
sprintf(str, intmin('int16'), intmax('int16'))
str = 'The range for int32 is:\n\t%d to %d ';
sprintf(str, intmin('int32'), intmax('int32'))
str = 'The range for int64 is:\n\t%d to %d ';
sprintf(str, intmin('int64'), intmax('int64'))
% displaying the smallest and largest unsigned integer data
str = 'The range for uint8 is:\n\t%d to %d ';
sprintf(str, intmin('uint8'), intmax('uint8'))
str = 'The range for uint16 is:\n\t%d to %d ';
sprintf(str, intmin('uint16'), intmax('uint16'))
str = 'The range for uint32 is:\n\t%d to %d ';
sprintf(str, intmin('uint32'), intmax('uint32'))
str = 'The range for uint64 is:\n\t%d to %d ';
sprintf(str, intmin('uint64'), intmax('uint64'))

运行该文件时,它显示以下结果 -

ans = The range for int8 is:
	-128 to 127 
ans = The range for int16 is:
	-32768 to 32767 
ans = The range for int32 is:
	-2147483648 to 2147483647 
ans = The range for int64 is:
	0 to 0 
ans = The range for uint8 is:
	0 to 255 
ans = The range for uint16 is:
	0 to 65535 
ans = The range for uint32 is:
	0 to -1 
ans = The range for uint64 is:
	0 to 18446744073709551616 

最小和最大浮点数

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

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

例子 (Example)

以下示例说明如何获取最小和最大浮点数。 创建一个脚本文件并在其中编写以下代码 -

% displaying the smallest and largest single-precision 
% floating point number
str = 'The range for single is:\n\t%g to %g and\n\t %g to  %g';
sprintf(str, -realmax('single'), -realmin('single'), ...
   realmin('single'), realmax('single'))
% displaying the smallest and largest double-precision 
% floating point number
str = 'The range for double is:\n\t%g to %g and\n\t %g to  %g';
sprintf(str, -realmax('double'), -realmin('double'), ...
   realmin('double'), realmax('double'))

运行该文件时,它显示以下结果 -

ans = The range for single is:                                                  
        -3.40282e+38 to -1.17549e-38 and                                        
         1.17549e-38 to  3.40282e+38                                            
ans = The range for double is:                                                  
        -1.79769e+308 to -2.22507e-308 and                                      
         2.22507e-308 to  1.79769e+308

MATLAB - Strings

在MATLAB中创建字符串非常简单。 事实上,我们已多次使用它。 例如,在命令提示符下键入以下内容 -

my_string = 'IOWIKI'

MATLAB将执行上述语句并返回以下结果 -

my_string = IOWIKI

MATLAB将所有变量视为数组,字符串被视为字符数组。 让我们使用whos命令检查上面创建的变量 -

whos

MATLAB将执行上述语句并返回以下结果 -

Name           Size            Bytes  Class    Attributes
my_string      1x16               32  char

有趣的是,您可以使用数字转换函数(如uint8uint16将字符串中的字符转换为其数字代码。 char函数将整数向量转换回字符 -

例子 (Example)

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

my_string = 'Tutorial''s Point';
str_ascii = uint8(my_string)        % 8-bit ascii values
str_back_to_char= char(str_ascii)  
str_16bit = uint16(my_string)       % 16-bit ascii values
str_back_to_char = char(str_16bit)  

运行该文件时,它显示以下结果 -

str_ascii =
   84  117  116  111  114  105   97  108   39  115   32   80  111  105  110  116
str_back_to_char = Tutorial's Point
str_16bit =
   84  117  116  111  114  105   97  108   39  115   32   80  111  105  110  116
str_back_to_char = Tutorial's Point

矩形字符数组

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

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

您可以通过以下任一方式垂直组合字符串 -

  • 使用MATLAB连接运算符[]并用分号(;)分隔每一行。 请注意,在此方法中,每行必须包含相同数量的字符。 对于具有不同长度的字符串,您应根据需要填充空格字符。

  • 使用char函数。 如果字符串具有不同的长度,则char将较短的字符串填充为尾随空白,以便每行具有相同的字符数。

例子 (Example)

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

doc_profile = ['Zara Ali                             '; ...
               'Sr. Surgeon                          '; ...
               'R N Tagore Cardiology Research Center']
doc_profile = char('Zara Ali', 'Sr. Surgeon', ...
                  'RN Tagore Cardiology Research Center')

运行该文件时,它显示以下结果 -

doc_profile =
Zara Ali                             
Sr. Surgeon                          
R N Tagore Cardiology Research Center
doc_profile =
Zara Ali                            
Sr. Surgeon                         
RN Tagore Cardiology Research Center

您可以通过以下任一方式水平组合字符串 -

  • 使用MATLAB连接运算符[]并用逗号或空格分隔输入字符串。 此方法保留输入数组中的任何尾随空格。

  • 使用字符串连接函数strcat 。 此方法删除输入中的尾随空格。

例子 (Example)

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

name =     'Zara Ali                             ';
position = 'Sr. Surgeon                          '; 
worksAt =  'R N Tagore Cardiology Research Center';
profile = [name ', ' position ', ' worksAt]
profile = strcat(name, ', ', position, ', ', worksAt)

运行该文件时,它显示以下结果 -

profile = Zara Ali      , Sr. Surgeon      , R N Tagore Cardiology Research Center
profile = Zara Ali,Sr. Surgeon,R N Tagore Cardiology Research Center

将字符串组合成单元阵列

从我们之前的讨论中可以清楚地看出,组合不同长度的字符串可能会很麻烦,因为数组中的所有字符串都必须具有相同的长度。 我们在字符串的末尾使用了空格来均衡它们的长度。

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

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

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

例子 (Example)

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

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

运行该文件时,它显示以下结果 -

{                                                                               
   [1,1] = Zara Ali                                                              
   [2,1] = Sr. Surgeon                                                           
   [3,1] = R N Tagore Cardiology Research Center                                 
}   

MATLAB中的字符串函数

MATLAB提供了许多字符串函数,用于创建,组合,解析,比较和操作字符串。

下表提供了MATLAB中字符串函数的简要说明 -

功能 目的
用于在字符数组中存储文本,组合字符数组等的函数。
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 对齐字符数组

例子 (Examples)

以下示例说明了上述一些字符串函数 -

格式化字符串

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

A = pi*1000*ones(1,5);
sprintf(' %f \n %.2f \n %+.2f \n %12.2f \n %012.2f \n', A)

运行该文件时,它显示以下结果 -

ans =  3141.592654 
   3141.59 
   +3141.59 
      3141.59 
   000003141.59 

加入字符串

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

%cell array of strings
str_array = {'red','blue','green', 'yellow', 'orange'};
% Join strings in cell array into single string
str1 = strjoin(str_array, "-")
str2 = strjoin(str_array, ",")

运行该文件时,它显示以下结果 -

str1 = red-blue-green-yellow-orange
str2 = red,blue,green,yellow,orange

查找和替换字符串

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

students = {'Zara Ali', 'Neha Bhatnagar', ...
            'Monica Malik', 'Madhu Gautam', ...
            'Madhu Sharma', 'Bhawna Sharma',...
            'Nuha Ali', 'Reva Dutta', ...
            'Sunaina Ali', 'Sofia Kabir'};
% The strrep function searches and replaces sub-string.
new_student = strrep(students(8), 'Reva', 'Poulomi')
% Display first names
first_names = strtok(students)

运行该文件时,它显示以下结果 -

new_student = 
{
   [1,1] = Poulomi Dutta
}
first_names = 
{
   [1,1] = Zara
   [1,2] = Neha
   [1,3] = Monica
   [1,4] = Madhu
   [1,5] = Madhu
   [1,6] = Bhawna
   [1,7] = Nuha
   [1,8] = Reva
   [1,9] = Sunaina
   [1,10] = Sofia
}

比较字符串

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

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

运行该文件时,它显示以下结果 -

str1 = This is test
str2 = This is text
ans = This is test and This is text are not equal

MATLAB - 函数

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

函数对自己工作空间中的变量进行操作,该工作空间也称为local workspace ,与您在MATLAB命令提示符(称为base workspace访问的工作local workspace分开。

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

函数语句的语法是 -

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

例子 (Example)

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

创建一个名为mymax.m的函数文件,并在其中键入以下代码 -

function max = mymax(n1, n2, n3, n4, n5)
%This function calculates the maximum of the
% five numbers given as input
max =  n1;
if(n2 > max)
   max = n2;
end
if(n3 > max)
   max = n3;
end
if(n4 > max)
   max = n4;
end
if(n5 > max)
   max = n5;
end

函数的第一行以关键字function开头。 它给出了函数的名称和参数的顺序。 在我们的示例中, mymax函数有五个输入参数和一个输出参数。

函数语句后面的注释行提供帮助文本。 键入时会打印这些行 -

help mymax

MATLAB将执行上述语句并返回以下结果 -

This function calculates the maximum of the
   five numbers given as input

您可以将该功能称为 -

mymax(34, 78, 89, 23, 11)

MATLAB将执行上述语句并返回以下结果 -

ans = 89

匿名函数

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

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

这样您就可以创建简单的函数,而无需为它们创建文件。

从表达式创建匿名函数的语法是

f = @(arglist)expression

例子 (Example)

在这个例子中,我们将编写一个名为power的匿名函数,它将两个数字作为输入,并将第一个数字返回到第二个数字的幂。

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

power = @(x, n) x.^n;
result1 = power(7, 3)
result2 = power(49, 0.5)
result3 = power(10, -10)
result4 = power (4.5, 1.5)

当您运行该文件时,它显示 -

result1 =  343
result2 =  7
result3 =  1.0000e-10
result4 =  9.5459

主函数和子函数 (Primary and Sub-Functions)

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

可以从命令行或其他函数从定义它们的文件外部调用主函数,但不能从函数文件外部的命令行或其他函数调用子函数。

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

例子 (Example)

让我们编写一个名为二次的函数来计算二次方程的根。 该函数将采用三个输入,二次系数,线性系数和常数项。 它会回归根源。

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

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

function [x1,x2] = quadratic(a,b,c)
%this function returns the roots of 
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficients of x2, x and the 
%constant term
% It returns the roots
d = disc(a,b,c); 
x1 = (-b + d)/(2*a);
x2 = (-b - d)/(2*a);
end   % end of quadratic
function dis = disc(a,b,c) 
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end   % end of sub-function

您可以从命令提示符调用上述函数 -

quadratic(2,4,-4)

MATLAB将执行上述语句并返回以下结果 -

ans = 0.7321

嵌套函数

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

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

嵌套函数遵循以下语法 -

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

例子 (Example)

让我们从前面的例子中重写quadratic函数,但是,这次盘函数将是一个嵌套函数。

创建一个函数文件quadratic2.m并在其中键入以下代码 -

function [x1,x2] = quadratic2(a,b,c)
function disc  % nested function
d = sqrt(b^2 - 4*a*c);
end   % end of function disc
disc;
x1 = (-b + d)/(2*a);
x2 = (-b - d)/(2*a);
end   % end of function quadratic2

您可以从命令提示符调用上述函数 -

quadratic2(2,4,-4)

MATLAB将执行上述语句并返回以下结果 -

ans =  0.73205

私有函数 (Private Functions)

私有函数是主要功能,仅对有限的一组其他函数可见。 如果您不想公开函数的实现,可以将它们创建为私有函数。

私有函数驻留在具有特殊名称private subfolders

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

例子 (Example)

让我们重写quadratic函数。 然而,这次计算判别式的disc函数将是私有函数。

在工作目录中创建一个名为private的子文件夹。 将以下功能文件disc.m在其中 -

function dis = disc(a,b,c) 
%function calculates the discriminant
dis = sqrt(b^2 - 4*a*c);
end      % end of sub-function

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

function [x1,x2] = quadratic3(a,b,c)
%this function returns the roots of 
% a quadratic equation.
% It takes 3 input arguments
% which are the co-efficient of x2, x and the 
%constant term
% It returns the roots
d = disc(a,b,c); 
x1 = (-b + d)/(2*a);
x2 = (-b - d)/(2*a);
end      % end of quadratic3

您可以从命令提示符调用上述函数 -

quadratic3(2,4,-4)

MATLAB将执行上述语句并返回以下结果 -

ans =  0.73205

全局变量 (Global Variables)

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

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

全局声明必须在变量实际用于函数之前发生。 最好使用大写字母表示全局变量的名称,以便将它们与其他变量区分开来。

例子 (Example)

让我们创建一个名为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)

运行该文件时,它将显示以下结果 -

av =  35.500

MATLAB - Data Import

在MATLAB中导入数据意味着从外部文件加载数据。 importdata函数允许加载不同格式的各种数据文件。 它有以下五种形式 -

Sr.No. 功能说明
1

A = importdata(filename)

将数据从filename表示的filename加载到数组A.

2

A = importdata('-pastespecial')

从系统剪贴板而不是从文件加载数据。

3

A = importdata(___, delimiterIn)

delimiterIn解释为ASCII文件,文件名或剪贴板数据中的列分隔符。 您可以将delimiterIn与上述语法中的任何输入参数一起使用。

4

A = importdata(___, delimiterIn, headerlinesIn)

从ASCII文件,文件名或剪贴板加载数据,从行headerlinesIn+1开始读取数字数据。

5

[A, delimiterOut, headerlinesOut] = importdata(___)

使用先前语法中的任何输入参数,返回检测到的delimiterOut中输入ASCII文件的delimiterOut符字符以及headerlinesOut检测到的标题行数。

默认情况下,Octave不支持importdata()函数,因此您必须搜索并安装此软件包,以使以下示例与您的Octave安装一起使用。

例子1 (Example 1)

让我们加载并显示图像文件。 创建一个脚本文件并在其中键入以下代码 -

filename = 'smile.jpg';
A = importdata(filename);
image(A);

运行该文件时,MATLAB显示图像文件。 但是,您必须将其存储在当前目录中。

导入Imange文件

例子2 (Example 2)

在此示例中,我们导入文本文件并指定分隔符和列标题。 让我们创建一个带有列标题的空格分隔的ASCII文件,名为weeklydata.txt

我们的文本文件weeklydata.txt看起来像这样 -

SunDay  MonDay  TuesDay  WednesDay  ThursDay  FriDay  SaturDay
95.01   76.21   61.54    40.57       55.79    70.28   81.53
73.11   45.65   79.19    93.55       75.29    69.87   74.68
60.68   41.85   92.18    91.69       81.32    90.38   74.51
48.60   82.14   73.82    41.03       0.99     67.22   93.18
89.13   44.47   57.63    89.36       13.89    19.88   46.60

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

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

运行该文件时,它显示以下结果 -

SunDay
   95.0100
   73.1100
   60.6800
   48.6000
   89.1300
MonDay
   76.2100
   45.6500
   41.8500
   82.1400
   44.4700
TuesDay
   61.5400
   79.1900
   92.1800
   73.8200
   57.6300
WednesDay
   40.5700
   93.5500
   91.6900
   41.0300
   89.3600
ThursDay
   55.7900
   75.2900
   81.3200
   0.9900
   13.8900
FriDay
   70.2800
   69.8700
   90.3800
   67.2200
   19.8800
SaturDay
   81.5300
   74.6800
   74.5100
   93.1800
   46.6000

例子3 (Example 3)

在此示例中,让我们从剪贴板导入数据。

将以下行复制到剪贴板 -

Mathematics is simple

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

A = importdata('-pastespecial')

运行该文件时,它显示以下结果 -

A = 
   'Mathematics is simple'

低级文件I/O.

importdata函数是一个高级函数。 MATLAB中的低级文件I/O函数允许最大程度地控制对文件的读取或写入数据。 但是,这些功能需要有关您的文件的更详细信息才能有效工作。

MATLAB为字节或字符级别的读写操作提供以下功能 -

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

使用低级I/O导入文本数据文件

MATLAB为文本数据文件的低级导入提供以下功能 -

  • fscanf函数以文本或ASCII文件读取格式化数据。

  • fgetlfgets函数一次读取一行文件,其中换行符分隔每一行。

  • fread函数以字节或位级别读取数据流。

例子 (Example)

我们在工作目录中保存了一个文本数据文件'myfile.txt'。 该文件存储了三个月的降雨量数据; 2012年6月,7月和8月。

myfile.txt中的数据包含五个地方的重复时间,月份和降雨量测量集。 标题数据存储月数M; 所以我们有M组测量。

该文件看起来像这样 -

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 
10.46  13.17  NaN    14.89 19.33
20.97  19.50  17.65  14.45 14.00
18.23  10.34  17.95  16.46 19.34
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
30.46  33.17  NaN    34.89  29.33
30.97  49.50  47.65  24.45 34.00
28.67  30.34  27.95  36.46 29.34
15:03:40
August-2012
17.09  16.55  19.59  17.25 19.22
17.54  11.45  13.48  22.55 24.01
NaN    21.19  25.85  25.05 27.21
26.79  24.98  12.23  16.99 18.67
17.54  11.45  13.48  22.55 24.01
NaN    21.19  25.85  25.05 27.21
26.79  24.98  12.23  16.99 18.67

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

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

  • 使用format specifiers描述文件中的数据,例如字符串的' %d ',整数的' %d '或浮点数的' %f '。

  • 要跳过文件中的文字字符,请将它们包含在格式说明中。 要跳过数据字段,请在说明符中使用星号('*')。

    例如,要读取标题并返回M的单个值,我们写 -

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

  • 我们将在工作空间中创建一个名为mydata的结构,以存储从文件中读取的数据。 此结构有三个字段 - timemonthraindata数组。

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

filename = '/data/myfile.txt';
rows = 7;
cols = 5;
% open the file
fid = fopen(filename);
% read the file headers, find M (number of months)
M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1);
% read each set of measurements
for n = 1:M
   mydata(n).time = fscanf(fid, '%s', 1);
   mydata(n).month = fscanf(fid, '%s', 1);
   % fscanf fills the array in column order,
   % so transpose the results
   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
% close the file
fclose(fid);

运行该文件时,它显示以下结果 -

12:00:00
June-2012
   17.2100   17.5700   11.0900   13.1700   14.4500
   28.5200       NaN    9.5900       NaN   14.0000
   39.7800   12.0100    9.3300   14.8900   18.2300
   16.5500   17.9200       NaN   19.3300   10.3400
   23.6700   28.4900    0.3100   20.9700   17.9500
   19.1500   17.4000    0.2300   19.5000   16.4600
   0.3500   17.0600   10.4600   17.6500   19.3400
09:10:02
July-2012
   12.7600       NaN   34.0000   33.1700   24.4500
   16.9400   24.8900   18.2300       NaN   34.0000
   14.3800   19.3300   30.3400   34.8900   28.6700
   11.8600   30.9700   27.9500   29.3300   30.3400
   16.8900   49.5000   16.4600   30.9700   27.9500
   20.4600   47.6500   19.3400   49.5000   36.4600
   23.1700   24.4500   30.4600   47.6500   29.3400
15:03:40
August-2012
   17.0900   13.4800   27.2100   11.4500   25.0500
   16.5500   22.5500   26.7900   13.4800   27.2100
   19.5900   24.0100   24.9800   22.5500   26.7900
   17.2500       NaN   12.2300   24.0100   24.9800
   19.2200   21.1900   16.9900       NaN   12.2300
   17.5400   25.8500   18.6700   21.1900   16.9900
   11.4500   25.0500   17.5400   25.8500   18.6700

MATLAB - Data Output

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

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

  • 来自数组的矩形,分隔的ASCII数据文件。

  • 击键日记(或日志)文件以及生成的文本输出。

  • 使用fprintf等低级函数的专用ASCII文件。

  • MEX文件,用于访问写入特定文本文件格式的C/C ++或Fortran例程。

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

有两种方法可以将数值数组导出为分隔的ASCII数据文件 -

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

  • 使用dlmwrite函数

使用保存功能的语法是 -

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是分隔符。

例子 (Example)

以下示例演示了该概念。 创建一个脚本文件并键入以下代码 -

num_array = [ 1 2 3 4 ; 4 5 6 7; 7 8 9 0];
save array_data1.out num_array -ascii;
type array_data1.out
dlmwrite('array_data2.out', num_array, ' ');
type array_data2.out

运行该文件时,它显示以下结果 -

   1.0000000e+00   2.0000000e+00   3.0000000e+00   4.0000000e+00
   4.0000000e+00   5.0000000e+00   6.0000000e+00   7.0000000e+00
   7.0000000e+00   8.0000000e+00   9.0000000e+00   0.0000000e+00
1 2 3 4
4 5 6 7
7 8 9 0

请注意,save -ascii命令和dlmwrite函数不能用于单元格数组作为输入。 要从单元格数组的内容创建分隔的ASCII文件,您可以

  • 或者,使用cell2mat函数将单元格数组转换为矩阵

  • 或者使用低级文件I/O函数导出单元阵列。

如果使用save函数将字符数组写入ASCII文件,则会将ASCII等效字符写入文件。

例如,让我们将“hello”一词写入文件 -

h = 'hello';
save textdata.out h -ascii
type textdata.out

MATLAB执行上述语句并显示以下结果。 这是8位ASCII格式的字符串'hello'的字符。

1.0400000e+02   1.0100000e+02   1.0800000e+02   1.0800000e+02   1.1100000e+02

写日记文件

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

要打开日记功能,请键入 -

diary

或者,您可以提供日志文件的名称,例如 -

diary logdata.out

要关闭日记功能 -

diary off

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

使用低级I/O将数据导出到文本数据文件

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

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

处理完文件后,需要使用fclose(fid)函数关闭它。

以下示例演示了该概念 -

例子 (Example)

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

% create a matrix y, with two rows
x = 0:10:100;
y = [x; log(x)];
% open a file for writing
fid = fopen('logtable.txt', 'w');
% Table Header
fprintf(fid, 'Log     Function\n\n');
% print values in column order
% two values appear on each row of the file
fprintf(fid, '%f    %f\n', y);
fclose(fid);
% display the file created
type logtable.txt

运行该文件时,它显示以下结果 -

Log         Function
0.000000    -Inf
10.000000    2.302585
20.000000    2.995732
30.000000    3.401197
40.000000    3.688879
50.000000    3.912023
60.000000    4.094345
70.000000    4.248495
80.000000    4.382027
90.000000    4.499810
100.000000    4.605170

MATLAB - Plotting

要绘制函数的图形,您需要执行以下步骤 -

  • 通过指定要为其绘制函数的变量x range of values定义x

  • 定义函数, y = f(x)

  • 调用plot命令,如plot(x, y)

以下示例将演示该概念。 让我们绘制简单函数y = xy = x的值范围从0到100,增量为5。

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

x = [0:5:100];
y = x;
plot(x, y)

运行该文件时,MATLAB显示以下图表 -

绘制y = x

让我们再举一个例子来绘制函数y = x 2 。 在这个例子中,我们将绘制两个具有相同功能的图形,但在第二次,我们将减少增量的值。 请注意,随着我们减少增量,图表变得更加平滑。

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

x = [1 2 3 4 5 6 7 8 9 10];
x = [-100:20:100];
y = x.^2;
plot(x, y)

运行该文件时,MATLAB显示以下图表 -

绘制y = x ^ 2

稍微更改代码文件,将增量减少到5 -

x = [-100:5:100];
y = x.^2;
plot(x, y)

MATLAB绘制更平滑的图形 -

以较小的增量绘制y = x ^ 2

在图表上添加标题,标签,网格线和缩放

MATLAB允许您添加标题,沿x轴和y轴的标签,网格线以及调整轴以使图形更加丰富。

  • xlabelylabel命令沿x轴和y轴生成标签。

  • title命令允许您在图表上添加标题。

  • grid on命令允许您将网格线放在图形上。

  • axis equal命令允许生成具有相同比例因子和两个轴上的空间的图。

  • axis square命令生成方形图。

例子 (Example)

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

x = [0:0.01:10];
y = sin(x);
plot(x, y), xlabel('x'), ylabel('Sin(x)'), title('Sin(x) Graph'),
grid on, axis equal

MATLAB生成以下图表 -

修改我们的图表

在同一图上绘制多个函数

您可以在同一个绘图上绘制多个图形。 以下示例演示了该概念 -

例子 (Example)

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

x = [0 : 0.01: 10];
y = sin(x);
g = cos(x);
plot(x, y, x, g, '.-'), legend('Sin(x)', 'Cos(x)')

MATLAB生成以下图表 -

同一图上的多个函数

在图表上设置颜色

MATLAB为绘制图形提供了八种基本颜色选项。 下表显示了颜色及其代码 -

颜色
wWhite
kBlack
bBlue
rRed
cCyan
gGreen
mMagenta
yYellow

例子 (Example)

让我们绘制两个多项式的图

  • f(x)= 3x 4 + 2x 3 + 7x 2 + 2x + 9和

  • g(x)= 5x 3 + 9x + 2

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

x = [-10 : 0.01: 10];
y = 3*x.^4 + 2 * x.^3 + 7 * x.^2 + 2 * x + 9;
g = 5 * x.^3 + 9 * x + 2;
plot(x, y, 'r', x, g, 'g')

运行该文件时,MATLAB会生成以下图表 -

图上的颜色

设置轴刻度

axis命令允许您设置轴刻度。 您可以使用axis命令以下列方式为x和y轴提供最小值和最大值 -

axis ( [xmin xmax ymin ymax] )

以下示例显示了这一点 -

例子 (Example)

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

x = [0 : 0.01: 10];
y = exp(-x).* sin(2*x + 3);
plot(x, y), axis([0 10 -1 1])

运行该文件时,MATLAB会生成以下图表 -

设置轴刻度

Generating Sub-Plots

在同一图中创建绘图数组时,每个绘图都称为子绘图。 subplot命令用于创建子图。

该命令的语法是 -

subplot(m, n, p)

其中, mn是绘图数组的行数和列数, p指定放置特定绘图的位置。

使用subplot命令创建的每个绘图都可以具有自己的特征。 以下示例演示了这一概念 -

例子 (Example)

让我们生成两个图 -

y = e -1.5x sin(10x)

y = e -2x sin(10x)

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

x = [0:0.01:5];
y = exp(-1.5*x).*sin(10*x);
subplot(1,2,1)
plot(x,y), xlabel('x'),ylabel('exp(–1.5x)*sin(10x)'),axis([0 5 -1 1])
y = exp(-2*x).*sin(10*x);
subplot(1,2,2)
plot(x,y),xlabel('x'),ylabel('exp(–2x)*sin(10x)'),axis([0 5 -1 1])

运行该文件时,MATLAB会生成以下图表 -

生成子图

MATLAB - Graphics

本章将继续探索MATLAB的绘图和图形功能。 我们将讨论 -

  • 绘制条形图
  • 绘制轮廓
  • 三维图

绘图条形图

bar命令绘制二维条形图。 让我们举一个例子来证明这个想法。

例子 (Example)

让我们有一个有10名学生的虚构教室。 我们知道这些学生获得的分数百分比是75,58,90,87,50,85,92,75,60和95.我们将绘制这些数据的条形图。

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

x = [1:10];
y = [75, 58, 90, 87, 50, 85, 92, 75, 60, 95];
bar(x,y), xlabel('Student'),ylabel('Score'),
title('First Sem:')
print -deps graph.eps

运行该文件时,MATLAB显示以下条形图 -

绘图条形图

绘制轮廓

两个变量的函数的等高线是曲线,函数具有恒定值。 轮廓线用于通过连接高于给定水平的相等高度的点(例如平均海平面)来创建等高线图。

MATLAB提供了用于绘制等高线图的contour功能。

例子 (Example)

让我们生成一个等高线图,显示给定函数g = f(x,y)的等高线。 这个函数有两个变量。 因此,我们必须生成两个独立变量,即两个数据集x和y。 这是通过调用meshgrid命令完成的。

meshgrid命令用于生成元素矩阵,该矩阵给出x和y上的范围以及每种情况下的增量规范。

让我们绘制函数g = f(x,y),其中-5≤x≤5,-3≤y≤3。让我们对这两个值取0.1的增量。 变量设置为 -

[x,y] = meshgrid(–5:0.1:5, –3:0.1:3);

最后,我们需要分配功能。 让我们的函数为:x 2 + y 2

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

[x,y] = meshgrid(-5:0.1:5,-3:0.1:3);   %independent variables
g = x.^2 + y.^2;                       % our function
contour(x,y,g)                         % call the contour function
print -deps graph.eps

运行该文件时,MATLAB显示以下等高线图 -

Matlab中的轮廓图

让我们稍微修改一下代码以修饰地图

[x,y] = meshgrid(-5:0.1:5,-3:0.1:3);   %independent variables
g = x.^2 + y.^2;                       % our function
[C, h] = contour(x,y,g);               % call the contour function
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
print -deps graph.eps

运行该文件时,MATLAB显示以下等高线图 -

一个好看的轮廓图

三维图

三维图基本上显示由两个变量中的函数定义的表面,g = f(x,y)。

和以前一样,为了定义g,我们首先使用meshgrid命令在函数域上创建一组(x,y)点。 接下来,我们分配函数本身。 最后,我们使用surf命令创建表面图。

以下示例演示了该概念 -

例子 (Example)

让我们为函数g = xe创建一个3D表面图- (x 2 + y 2

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

[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

运行该文件时,MATLAB显示以下三维地图 -

Matlab中的三维地图

您还可以使用mesh命令生成三维曲面。 但是, surf命令以颜色显示连接线和曲面的面,而mesh命令创建一个线框曲面,其中彩色线连接定义点。

MATLAB - Algebra

到目前为止,我们已经看到所有示例都在MATLAB以及GNU中工作,或者称为Octave。 但是对于求解基本代数方程,MATLAB和Octave都没什么不同,所以我们将尝试在单独的部分中介绍MATLAB和Octave。

我们还将讨论代数表达式的分解和简化。

在MATLAB中求解基本代数方程

solve函数用于求解代数方程。 在最简单的形式中,solve函数将引号括起来的等式作为参数。

例如,让我们在等式x-5 = 0中求解x

solve('x-5=0')

MATLAB将执行上述语句并返回以下结果 -

ans =
   5

您也可以将求解函数称为 -

y = solve('x-5 = 0')

MATLAB将执行上述语句并返回以下结果 -

y =
   5

您甚至可能不包括等式的右侧 -

solve('x-5')

MATLAB将执行上述语句并返回以下结果 -

ans =
   5

如果方程涉及多个符号,那么默认情况下MATLAB假设您正在求x,但是,求解函数有另一种形式 -

solve(equation, variable)

在哪里,你还可以提到变量。

例如,让我们解决方程v - u - 3t 2 = 0,对于v。在这种情况下,我们应该写 -

solve('v-u-3*t^2=0', 'v')

MATLAB将执行上述语句并返回以下结果 -

ans =
   3*t^2 + u

求解Octave中的基本代数方程

roots函数用于求解Octave中的代数方程式,您可以按照以下方式编写上述示例 -

例如,让我们在等式x-5 = 0中求解x

roots([1, -5])

Octave将执行上述声明并返回以下结果 -

ans = 5

您也可以将求解函数称为 -

y = roots([1, -5])

Octave将执行上述声明并返回以下结果 -

y = 5

在MATLAB中求解二次方程

solve函数也可以求解高阶方程。 它通常用于求解二次方程。 该函数返回数组中方程的根。

以下示例解决了二次方程式x 2 -7x +12 = 0.创建脚本文件并键入以下代码 -

eq = 'x^2 -7*x + 12 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

运行该文件时,它显示以下结果 -

The first root is: 
   3
The second root is: 
   4

求解八度的二次方程

以下示例在Octave中求解二次方程x 2 -7x +12 = 0。 创建一个脚本文件并键入以下代码 -

s = roots([1, -7, 12]);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));

运行该文件时,它显示以下结果 -

The first root is: 
   4
The second root is: 
   3

在MATLAB中求解高阶方程

solve函数也可以求解高阶方程。 例如,让我们求解三次方程为(x-3) 2 (x-7)= 0

solve('(x-3)^2*(x-7)=0')

MATLAB将执行上述语句并返回以下结果 -

ans =
   3
   3
   7

在高阶方程的情况下,根很长,包含许多项。 您可以通过将它们转换为double来获得此类根的数值。 以下示例解决了四阶方程x 4 - 7x 3 + 3x 2 - 5x + 9 = 0。

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

eq = 'x^4 - 7*x^3 + 3*x^2 - 5*x + 9 = 0';
s = solve(eq);
disp('The first root is: '), disp(s(1));
disp('The second root is: '), disp(s(2));
disp('The third root is: '), disp(s(3));
disp('The fourth root is: '), disp(s(4));
% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

运行该文件时,它返回以下结果 -

The first root is: 
6.630396332390718431485053218985
 The second root is: 
1.0597804633025896291682772499885
 The third root is: 
- 0.34508839784665403032666523448675 - 1.0778362954630176596831109269793*i
 The fourth root is: 
- 0.34508839784665403032666523448675 + 1.0778362954630176596831109269793*i
Numeric value of first root
   6.6304
Numeric value of second root
   1.0598
Numeric value of third root
   -0.3451 - 1.0778i
Numeric value of fourth root
   -0.3451 + 1.0778i

请注意,最后两个根是复数。

求解Octave中的高阶方程

以下示例解决了四阶方程x 4 - 7x 3 + 3x 2 - 5x + 9 = 0。

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

v = [1, -7,  3, -5, 9];
s = roots(v);
% converting the roots to double type
disp('Numeric value of first root'), disp(double(s(1)));
disp('Numeric value of second root'), disp(double(s(2)));
disp('Numeric value of third root'), disp(double(s(3)));
disp('Numeric value of fourth root'), disp(double(s(4)));

运行该文件时,它返回以下结果 -

Numeric value of first root
 6.6304
Numeric value of second root
-0.34509 + 1.07784i
Numeric value of third root
-0.34509 - 1.07784i
Numeric value of fourth root
 1.0598

MATLAB中求解方程组

solve函数还可用于生成涉及多于一个变量的方程组的解。 让我们举一个简单的例子来证明这种用法。

让我们解决方程式 -

5x + 9y = 5

3x - 6y = 4

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

s = solve('5*x + 9*y = 5','3*x - 6*y = 4');
s.x
s.y

运行该文件时,它显示以下结果 -

ans =
   22/19
ans =
   -5/57

同样,您可以解决更大的线性系统。 考虑以下方程组 -

x + 3y -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

Octave中方程组的求解

我们有一个不同的方法来解决'n'未知数的'n'线性方程组。 让我们举一个简单的例子来证明这种用法。

让我们解决方程式 -

5x + 9y = 5

3x - 6y = 4

这样的线性方程组可以写成单矩阵方程Ax = b,其中A是系数矩阵,b是包含线性方程右边的列向量,x是表示解是如下程序所示 -

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

A = [5, 9; 3, -6];
b = [5;4];
A\b

运行该文件时,它显示以下结果 -

ans =
   1.157895
  -0.087719

同样,您可以解决更大的线性系统,如下所示 -

x + 3y -2z = 5

3x + 5y + 6z = 7

2x + 4y + 3z = 8

在MATLAB中扩展和收集方程

expandcollect功能分别扩展和收集方程。 以下示例演示了这些概念 -

使用许多符号函数时,应声明变量是符号的。

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

syms x   %symbolic variable x
syms y   %symbolic variable x
% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(sin(2*x))
expand(cos(x+y))
% collecting equations
collect(x^3 *(x-7))
collect(x^4*(x-3)*(x-5))

运行该文件时,它显示以下结果 -

ans =
   x^2 + 4*x - 45
ans =
   x^4 + x^3 - 43*x^2 + 23*x + 210
ans =
   2*cos(x)*sin(x)
ans =
   cos(x)*cos(y) - sin(x)*sin(y)
ans =
   x^4 - 7*x^3
ans =
   x^6 - 8*x^5 + 15*x^4

Octave中的方程扩展和收集

你需要有symbolic包,它提供expandcollect功能,分别扩展和收集方程。 以下示例演示了这些概念 -

当您使用许多符号函数时,您应该声明您的变量是符号的,但Octave有不同的方法来定义符号变量。 注意SinCos的使用,它们也在符号包中定义。

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

% first of all load the package, make sure its installed.
pkg load symbolic
% make symbols module available
symbols
% define symbolic variables
x = sym ('x');
y = sym ('y');
z = sym ('z');
% expanding equations
expand((x-5)*(x+9))
expand((x+2)*(x-3)*(x-5)*(x+7))
expand(Sin(2*x))
expand(Cos(x+y))
% collecting equations
collect(x^3 *(x-7), z)
collect(x^4*(x-3)*(x-5), z)

运行该文件时,它显示以下结果 -

ans =
-45.0+x^2+(4.0)*x
ans =
210.0+x^4-(43.0)*x^2+x^3+(23.0)*x
ans =
sin((2.0)*x)
ans =
cos(y+x)
ans =
x^(3.0)*(-7.0+x)
ans =
(-3.0+x)*x^(4.0)*(-5.0+x)

代数表达式的因式分解与简化

factor函数是表达式的factorsimplify函数简化了表达式。 以下示例演示了该概念 -

例子 (Example)

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

syms x
syms y
factor(x^3 - y^3)
factor([x^2-y^2,x^3+y^3])
simplify((x^4-16)/(x^2-4))

运行该文件时,它显示以下结果 -

ans =
   (x - y)*(x^2 + x*y + y^2)
ans =
   [ (x - y)*(x + y), (x + y)*(x^2 - x*y + y^2)]
ans =
   x^2 + 4

MATLAB - Calculus

MATLAB提供了解决微分和积分微积分问题的各种方法,解决了任意度数的微分方程和极限的计算。 最重要的是,您可以通过求解原始函数及其导数,轻松绘制复杂函数的图形并检查图形上的最大值,最小值和其他文具点。

本章将讨论微积分问题。 在本章中,我们将讨论预演算概念,即计算函数的极限和验证极限的性质。

在下一章“ Differential ,我们将计算表达式的导数并在图形上找到局部最大值和最小值。 我们还将讨论求解微分方程。

最后,在Integration一章中,我们将讨论积分计算。

计算限制

MATLAB提供了计算限制的limit功能。 在最基本的形式中, limit函数将表达式作为参数,并在独立变量变为零时查找表达式的限制。

例如,让我们计算函数f(x)=(x 3 + 5)/(x 4 + 7)的极限 ,因为x趋于零。

syms x
limit((x^3 + 5)/(x^4 + 7))

MATLAB将执行上述语句并返回以下结果 -

ans =
   5/7

限制函数属于符号计算领域; 你需要使用syms函数告诉MATLAB你正在使用哪些符号变量。 您还可以计算函数的限制,因为变量趋向于除零之外的某个数字。 要计算lim x-“a (f(x)),我们使用带有参数的limit命令。 第一个是表达式,第二个是数字, x接近,这里是a

例如,让我们计算函数f(x)=(x-3)/(x-1)的极限,因为x趋于1。

limit((x - 3)/(x-1),1)

MATLAB将执行上述语句并返回以下结果 -

ans =
   NaN

让我们再看一个例子,

limit(x^2 + 5, 3)

MATLAB将执行上述语句并返回以下结果 -

ans =
   14

使用Octave计算限制

以下是使用symbolic包的上述示例的Octave版本,尝试执行并比较结果 -

pkg load symbolic
symbols
x = sym("x");
subs((x^3+5)/(x^4+7),x,0)

Octave将执行上述声明并返回以下结果 -

ans =
   0.7142857142857142857

限制基本属性的验证

代数极限定理提供了极限的一些基本属性。 这些如下 -

限制的基本属性

让我们考虑两个功能 -

  • f(x)=(3x + 5)/(x - 3)
  • g(x)= x 2 + 1。

让我们计算两个函数中x趋于5的函数的极限,并使用这两个函数和MATLAB验证极限的基本属性。

例子 (Example)

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

syms x
f = (3*x + 5)/(x-3);
g = x^2 + 1;
l1 = limit(f, 4)
l2 = limit (g, 4)
lAdd = limit(f + g, 4)
lSub = limit(f - g, 4)
lMult = limit(f*g, 4)
lDiv = limit (f/g, 4)

当您运行该文件时,它显示 -

l1 =
   17
l2 =
   17
lAdd =
   34
lSub =
   0
lMult =
   289
lDiv =
   1

用Octave验证极限的基本性质

以下是使用symbolic包的上述示例的Octave版本,尝试执行并比较结果 -

pkg load symbolic
symbols
x = sym("x");
f = (3*x + 5)/(x-3);
g = x^2 + 1;
l1 = subs(f, x, 4)
l2 = subs (g, x, 4)
lAdd = subs (f+g, x, 4)
lSub = subs (f-g, x, 4)
lMult = subs (f*g, x, 4)
lDiv = subs (f/g, x, 4)

Octave将执行上述声明并返回以下结果 -

l1 =
   17.0
l2 =
   17.0
lAdd =
   34.0
lSub =
   0.0
lMult =
   289.0
lDiv =
   1.0

左右两侧限制

当函数对某个特定的变量值具有不连续性时,该点上不存在该限制。 换句话说,函数f(x)的极限在x = a时具有不连续性,当x从左侧接近x时,极限值不等于x从右侧接近时的极限值。

这导致左手和右手限制的概念。 对于x a,从左边开始,即x接近a。 对于x> a的值,右手限制被定义为x - > a,从右边开始,即x接近a。 当左手限制和右手限制不相等时,限制不存在。

让我们考虑一个功能 -

f(x) = (x - 3)/|x - 3|

我们将证明lim x-“3 f(x)不存在。 MATLAB帮助我们以两种方式建立这一事实 -

  • 通过绘制函数图并显示不连续性。
  • 通过计算限制并显示两者都不同。

通过将字符串“left”和“right”作为最后一个参数传递给limit命令来计算左手和右手限制。

例子 (Example)

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

f = (x - 3)/abs(x-3);
ezplot(f,[-1,5])
l = limit(f,x,3,'left')
r = limit(f,x,3,'right')

运行该文件时,MATLAB绘制以下图表

函数的不连续性

在此之后显示输出 -

l =
   -1
r =
   1

MATLAB - Differential

MATLAB提供了用于计算符号导数的diff命令。 在最简单的形式中,您将要区分为diff命令的函数作为参数传递。

例如,让我们计算函数f(t)= 3t 2 + 2t -2的导数

例子 (Example)

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

syms t
f = 3*t^2 + 2*t^(-2);
diff(f)

编译并执行上述代码时,会产生以下结果 -

ans =
6*t - 4/t^3

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
t = sym("t");
f = 3*t^2 + 2*t^(-2);
differentiate(f,t)

Octave执行代码并返回以下结果 -

ans =
   -(4.0)*t^(-3.0)+(6.0)*t

基本分化规则的验证

让我们简要说明用于区分函数的各种方程或规则并验证这些规则。 为此,我们将f'(x)表示为一阶导数,f“(x)表示二阶导数。

以下是差异化的规则 -

Rule 1

对于任何函数f和g以及任何实数a和b是函数的导数 -

h(x) = af(x) + bg(x)相对于x由下式给出 -

h'(x) = af'(x) + bg'(x)

Rule 2

sum规则表明如果f和g是两个函数,f'和g'分别是它们的导数,那么,

f + g)' = f' + g'

(f - g)' = f' - g'

Rule 3

product规则规定如果f和g是两个函数,f'和g'分别是它们的导数,那么,

(fg)' = f'.g + g'.f

Rule 4

quotient规则指出如果f和g是两个函数,f'和g'分别是它们的导数,那么,

(f/g)' = (f'.g - g'.f)/g 2

Rule 5

polynomial或基本幂次规则表明,如果y = f(x) = x n ,则f' = n. x (n-1) f' = n. x (n-1)

该规则的直接结果是任何常数的导数为零,即,如果y = k ,则任何常数

f' = 0

Rule 6

chain规则指出函数h(x) = f(g(x))的函数相对于x的导数是,

h'(x)= f'(g(x)).g'(x)

例子 (Example)

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

syms x
syms t
f = (x + 2)*(x^2 + 3)
der1 = diff(f)
f = (t^2 + 3)*(sqrt(t) + t^3)
der2 = diff(f)
f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
der3 = diff(f)
f = (2*x^2 + 3*x)/(x^3 + 1)
der4 = diff(f)
f = (x^2 + 1)^17
der5 = diff(f)
f = (t^3 + 3* t^2 + 5*t -9)^(-6)
der6 = diff(f)

运行该文件时,MATLAB显示以下结果 -

f =
   (x^2 + 3)*(x + 2)
   der1 =
   2*x*(x + 2) + x^2 + 3
f =
   (t^(1/2) + t^3)*(t^2 + 3)
   der2 =
   (t^2 + 3)*(3*t^2 + 1/(2*t^(1/2))) + 2*t*(t^(1/2) + t^3)
f =
   (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2)
der3 =
   (2*x - 2)*(3*x^3 - 5*x^2 + 2) - (- 9*x^2 + 10*x)*(x^2 - 2*x + 1)
f =
   (2*x^2 + 3*x)/(x^3 + 1)
der4 =
   (4*x + 3)/(x^3 + 1) - (3*x^2*(2*x^2 + 3*x))/(x^3 + 1)^2
f =
   (x^2 + 1)^17
der5 =
   34*x*(x^2 + 1)^16
f =
   1/(t^3 + 3*t^2 + 5*t - 9)^6
der6 =
   -(6*(3*t^2 + 6*t + 5))/(t^3 + 3*t^2 + 5*t - 9)^7

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
t = sym("t");
f = (x + 2)*(x^2 + 3) 
der1 = differentiate(f,x) 
f = (t^2 + 3)*(t^(1/2) + t^3) 
der2 = differentiate(f,t) 
f = (x^2 - 2*x + 1)*(3*x^3 - 5*x^2 + 2) 
der3 = differentiate(f,x) 
f = (2*x^2 + 3*x)/(x^3 + 1) 
der4 = differentiate(f,x) 
f = (x^2 + 1)^17 
der5 = differentiate(f,x) 
f = (t^3 + 3* t^2 + 5*t -9)^(-6) 
der6 = differentiate(f,t)

Octave执行代码并返回以下结果 -

f =
(2.0+x)*(3.0+x^(2.0))
der1 =
3.0+x^(2.0)+(2.0)*(2.0+x)*x
f =
(t^(3.0)+sqrt(t))*(3.0+t^(2.0))
der2 =
(2.0)*(t^(3.0)+sqrt(t))*t+((3.0)*t^(2.0)+(0.5)*t^(-0.5))*(3.0+t^(2.0))
f =
(1.0+x^(2.0)-(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))
der3 =
(-2.0+(2.0)*x)*(2.0-(5.0)*x^(2.0)+(3.0)*x^(3.0))+((9.0)*x^(2.0)-(10.0)*x)*(1.0+x^(2.0)-(2.0)*x)
f =
(1.0+x^(3.0))^(-1)*((2.0)*x^(2.0)+(3.0)*x)
der4 =
(1.0+x^(3.0))^(-1)*(3.0+(4.0)*x)-(3.0)*(1.0+x^(3.0))^(-2)*x^(2.0)*((2.0)*x^(2.0)+(3.0)*x)
f =
(1.0+x^(2.0))^(17.0)
der5 =
(34.0)*(1.0+x^(2.0))^(16.0)*x
f =
(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-6.0)
der6 =
-(6.0)*(-9.0+(3.0)*t^(2.0)+t^(3.0)+(5.0)*t)^(-7.0)*(5.0+(3.0)*t^(2.0)+(6.0)*t)

指数,对数和三角函数的导数

下表提供了常用指数函数,对数函数和三角函数的导数 -

功能 衍生物
c ax c ax .ln ca(ln是自然对数)
e x e x
ln x 1/x
ln c x 1/x.ln c
x x x x 。(1 + ln x)
sin(x) cos(x)
cos(x) -sin(x)
tan(x) sec 2 (x),或1/cos 2 (x),或1 + tan 2 (x)
cot(x) -csc 2 (x),或-1/sin 2 (x),或 - (1 + cot 2 (x))
sec(x) sec(x).tan(x)
csc(x) -csc(x).cot(x)

例子 (Example)

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

syms x
y = exp(x)
diff(y)
y = x^9
diff(y)
y = sin(x)
diff(y)
y = tan(x)
diff(y)
y = cos(x)
diff(y)
y = log(x)
diff(y)
y = log10(x)
diff(y)
y = sin(x)^2
diff(y)
y = cos(3*x^2 + 2*x + 1)
diff(y)
y = exp(x)/sin(x)
diff(y)

运行该文件时,MATLAB显示以下结果 -

y =
   exp(x)
   ans =
   exp(x)
y =
   x^9
   ans =
   9*x^8
y =
   sin(x)
   ans =
   cos(x)
y =
   tan(x)
   ans =
   tan(x)^2 + 1
y =
   cos(x)
   ans =
   -sin(x)
y =
   log(x)
   ans =
   1/x
y =
   log(x)/log(10)
   ans =
   1/(x*log(10))
y =
   sin(x)^2
   ans =
   2*cos(x)*sin(x)
y =
   cos(3*x^2 + 2*x + 1)
   ans =
   -sin(3*x^2 + 2*x + 1)*(6*x + 2)
y =
   exp(x)/sin(x)
   ans =
   exp(x)/sin(x) - (exp(x)*cos(x))/sin(x)^2

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
y = Exp(x)
differentiate(y,x)
y = x^9
differentiate(y,x)
y = Sin(x)
differentiate(y,x)
y = Tan(x)
differentiate(y,x)
y = Cos(x)
differentiate(y,x)
y = Log(x)
differentiate(y,x)
% symbolic packages does not have this support
%y = Log10(x)
%differentiate(y,x)
y = Sin(x)^2
differentiate(y,x)
y = Cos(3*x^2 + 2*x + 1)
differentiate(y,x)
y = Exp(x)/Sin(x)
differentiate(y,x)

Octave执行代码并返回以下结果 -

y =
exp(x)
ans =
exp(x)
y =
x^(9.0)
ans =
(9.0)*x^(8.0)
y =
sin(x)
ans =
cos(x)
y =
tan(x)
ans =
1+tan(x)^2
y =
cos(x)
ans =
-sin(x)
y =
log(x)
ans =
x^(-1)
y =
sin(x)^(2.0)
ans =
(2.0)*sin(x)*cos(x)
y =
cos(1.0+(2.0)*x+(3.0)*x^(2.0))
ans =
-(2.0+(6.0)*x)*sin(1.0+(2.0)*x+(3.0)*x^(2.0))
y =
sin(x)^(-1)*exp(x)
ans =
sin(x)^(-1)*exp(x)-sin(x)^(-2)*cos(x)*exp(x)

计算高阶导数

为了计算函数f的更高导数,我们使用语法diff(f,n)

让我们计算函数y = f(x)= x .e -3x的二阶导数

f = x*exp(-3*x);
diff(f, 2)

MATLAB执行代码并返回以下结果 -

ans =
9*x*exp(-3*x) - 6*exp(-3*x)

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
f = x*Exp(-3*x);
differentiate(f, x, 2)

Octave执行代码并返回以下结果 -

ans =
(9.0)*exp(-(3.0)*x)*x-(6.0)*exp(-(3.0)*x)

例子 (Example)

在这个例子中,让我们解决一个问题。 假设函数y = f(x) = 3 sin(x) + 7 cos(5x) 。 我们必须弄清楚等式f" + f = -5cos(2x)成立。

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

syms x
y = 3*sin(x)+7*cos(5*x);  % defining the function
lhs = diff(y,2)+y;        %evaluting the lhs of the equation
rhs = -5*cos(2*x);        %rhs of the equation
if(isequal(lhs,rhs))
   disp('Yes, the equation holds true');
else
   disp('No, the equation does not hold true');
end
disp('Value of LHS is: '), disp(lhs);

运行该文件时,它显示以下结果 -

No, the equation does not hold true
Value of LHS is: 
-168*cos(5*x)

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
y = 3*Sin(x)+7*Cos(5*x);           % defining the function
lhs = differentiate(y, x, 2) + y;  %evaluting the lhs of the equation
rhs = -5*Cos(2*x);                 %rhs of the equation
if(lhs == rhs)
   disp('Yes, the equation holds true');
else
   disp('No, the equation does not hold true');
end
disp('Value of LHS is: '), disp(lhs);

Octave执行代码并返回以下结果 -

No, the equation does not hold true
Value of LHS is: 
-(168.0)*cos((5.0)*x)

找到曲线的最大值和最小值

如果我们正在搜索图的局部最大值和最小值,我们基本上是在特定位置的函数图上寻找最高点或最低点,或者是符号变量的特定值范围。

对于函数y = f(x),图形上具有零斜率的图上的stationary points称为stationary points 。 换句话说,静止点是f'(x)= 0的位置。

为了找到我们区分的函数的平稳点,我们需要将导数设置为零并求解方程。

例子 (Example)

让我们找到函数f(x)= 2x 3 + 3x 2 - 12x + 17的平稳点

采取以下步骤 -

First let us enter the function and plot its graph.

syms x
y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
ezplot(y)

MATLAB执行代码并返回以下图表 -

寻找千里马和最小值

以下是上述示例的Octave等效代码 -

pkg load symbolic
symbols
x = sym('x');
y = inline("2*x^3 + 3*x^2 - 12*x + 17");
ezplot(y)
print -deps graph.eps

Our aim is to find some local maxima and minima on the graph, so let us find the local maxima and minima for the interval [-2, 2] on the graph.

syms x
y = 2*x^3 + 3*x^2 - 12*x + 17;   % defining the function
ezplot(y, [-2, 2])

MATLAB执行代码并返回以下图表 -

寻找千里马和最小值

以下是上述示例的Octave等效代码 -

pkg load symbolic
symbols
x = sym('x');
y = inline("2*x^3 + 3*x^2 - 12*x + 17");
ezplot(y, [-2, 2])
print -deps graph.eps

Next, let us compute the derivative.

g = diff(y)

MATLAB执行代码并返回以下结果 -

g =
   6*x^2 + 6*x - 12

这是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)

Octave执行代码并返回以下结果 -

g =
   -12.0+(6.0)*x+(6.0)*x^(2.0)

Let us solve the derivative function, g, to get the values where it becomes zero.

s = solve(g)

MATLAB执行代码并返回以下结果 -

s =
   1
   -2

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)
roots([6, 6, -12])

Octave执行代码并返回以下结果 -

g =
-12.0+(6.0)*x^(2.0)+(6.0)*x
ans =
  -2
   1

This agrees with our plot. So let us evaluate the function f at the critical points x = 1, -2. 我们可以使用subs命令替换符号函数中的值。

subs(y, 1), subs(y, -2)

MATLAB执行代码并返回以下结果 -

ans =
   10
ans =
   37

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
y = 2*x^3 + 3*x^2 - 12*x + 17;
g = differentiate(y,x)
roots([6, 6, -12])
subs(y, x, 1), subs(y, x, -2)

ans =
   10.0
ans =
   37.0-4.6734207789940138748E-18*I

因此,函数f(x)= 2x 3 + 3x 2 - 12x + 17的最小值和最大值在区间[-2,2]中是10和37。

求解微分方程

MATLAB提供了用于象征性地求解微分方程的dsolve命令。

用于查找单个方程的解的dsolve命令的最基本形式是

dsolve('eqn') 

其中eqn是用于输入eqn的文本字符串。

它返回一个符号解决方案,其中包含一组MATLAB标记C1,C2等的任意常量。

您还可以指定问题的初始条件和边界条件,如下所示,以逗号分隔的列表为 -

dsolve('eqn','cond1', 'cond2',…)  

出于使用dsolve命令的目的,使用derivatives are indicated with a D 。 例如,输入f'(t)= -2 * f + cost(t)之类的等式作为 -

'Df = -2*f + cos(t)'

通过D导数的顺序表示更高的导数。

例如,方程f“(x)+ 2f'(x)= 5sin3x应输入 -

'D2y + 2Dy = 5*sin(3*x)'

让我们举一个简单的一阶微分方程的例子:y'= 5y。

s = dsolve('Dy = 5*y')

MATLAB执行代码并返回以下结果 -

s =
   C2*exp(5*t)

让我们将二阶微分方程的另一个例子作为:y“ - y = 0,y(0)= -1,y'(0)= 2。

dsolve('D2y - y = 0','y(0) = -1','Dy(0) = 2')

MATLAB执行代码并返回以下结果 -

ans =
   exp(t)/2 - (3*exp(-t))/2

MATLAB - Integration

集成处理两种本质上不同类型的问题。

  • 在第一种类型中,给出了函数的导数,我们想要找到函数。 因此,我们基本上扭转了分化的过程。 这种逆过程被称为反微分,或找到原始函数,或找到indefinite integral

  • 第二类问题涉及累加非常大量的非常小的数量,然后随着数量的大小接近零而采取限制,而术语的数量倾向于无穷大。 这个过程导致了definite integral的定义。

定义积分用于寻找面积,体积,重心,转动惯量,由力完成的工作以及许多其他应用。

使用MATLAB查找不定积分

根据定义,如果函数f(x)的导数是f'(x),那么我们说f'(x)相对于x的不定积分是f(x)。 例如,由于x 2的导数(相对于x)是2x,我们可以说2x的不定积分是x 2

符号 -

f'(x 2 ) = 2x ,因此,

∫ 2xdx = x 2 .

不定积分不是唯一的,因为对于任何常数c的值,x 2 + c的导数也将是2x。

这用符号表示为 -

∫ 2xdx = x 2 + c

其中,c称为“任意常数”。

MATLAB提供了一个用于计算表达式积分的int命令。 为了得到一个函数的不定积分的表达式,我们写 -

int(f);

例如,从我们之前的例子 -

syms x 
int(2*x)

MATLAB执行上述语句并返回以下结果 -

ans =
   x^2

例子1 (Example 1)

在这个例子中,让我们找到一些常用表达式的积分。 创建一个脚本文件并在其中键入以下代码 -

syms x n
int(sym(x^n))
f = 'sin(n*t)'
int(sym(f))
syms a t
int(a*cos(pi*t))
int(a^x)

运行该文件时,它显示以下结果 -

ans =
   piecewise([n == -1, log(x)], [n ~= -1, x^(n + 1)/(n + 1)])
f =
sin(n*t)
ans =
   -cos(n*t)/n
   ans =
   (a*sin(pi*t))/pi
   ans =
   a^x/log(a)

例子2 (Example 2)

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

syms x n
int(cos(x))
int(exp(x))
int(log(x))
int(x^-1)
int(x^5*cos(5*x))
pretty(int(x^5*cos(5*x)))
int(x^-5)
int(sec(x)^2)
pretty(int(1 - 10*x + 9 * x^2))
int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2)
pretty(int((3 + 5*x -6*x^2 - 7*x^3)/2*x^2))

请注意, pretty函数以更易读的格式返回表达式。

运行该文件时,它显示以下结果 -

ans =
   sin(x)
ans =
   exp(x)
ans =
   x*(log(x) - 1)
ans =
   log(x)
ans =
(24*cos(5*x))/3125 + (24*x*sin(5*x))/625 - (12*x^2*cos(5*x))/125 + (x^4*cos(5*x))/5 - (4*x^3*sin(5*x))/25 + (x^5*sin(5*x))/5
                                    2             4 
   24 cos(5 x)   24 x sin(5 x)   12 x  cos(5 x)   x  cos(5 x) 
   ----------- + ------------- - -------------- + ------------ 
      3125            625             125              5 
        3             5 
   4 x  sin(5 x)   x  sin(5 x) 
   ------------- + ----------- 
         25              5
ans =
-1/(4*x^4)
ans =
tan(x)
        2 
  x (3 x  - 5 x + 1)
ans = 
- (7*x^6)/12 - (3*x^5)/5 + (5*x^4)/8 + x^3/2
      6      5      4    3 
    7 x    3 x    5 x    x 
  - ---- - ---- + ---- + -- 
     12     5      8     2

使用MATLAB查找定积分

根据定义,定积分基本上是总和的极限。 我们使用定积分来找到诸如曲线和x轴之间的区域以及两条曲线之间的区域之类的区域。 定义积分也可用于其他情况,其中所需数量可表示为总和的极限。

通过传递要计算积分的限制, int函数可用于定积分。

计算

定积分

我们写,

int(x, a, b)

例如,要计算值 例 我们写 -

int(x, 4, 9)

MATLAB执行上述语句并返回以下结果 -

ans =
   65/2

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
f = x;
c = [1, 0];
integral = polyint(c);
a = polyval(integral, 9) - polyval(integral, 4);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 -

Area: 
   32.500

可以使用Octave提供的quad()函数给出替代解决方案,如下所示 -

pkg load symbolic
symbols
f = inline("x");
[a, ierror, nfneval] = quad(f, 4, 9);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 -

Area: 
   32.500

例子1 (Example 1)

让我们计算在x轴和曲线y = x 3 -2x + 5之间的区域,并且纵坐标x = 1和x = 2。

所需面积由 - 给出 -

面积计算

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

f = x^3 - 2*x +5;
a = int(f, 1, 2)
display('Area: '), disp(double(a));

运行该文件时,它显示以下结果 -

a =
23/4
Area: 
   5.7500

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
f = x^3 - 2*x +5;
c = [1, 0, -2, 5];
integral = polyint(c);
a = polyval(integral, 2) - polyval(integral, 1);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 -

Area: 
   5.7500

可以使用Octave提供的quad()函数给出替代解决方案,如下所示 -

pkg load symbolic
symbols
x = sym("x");
f = inline("x^3 - 2*x +5");
[a, ierror, nfneval] = quad(f, 1, 2);
display('Area: '), disp(double(a));

Octave执行代码并返回以下结果 -

Area: 
   5.7500

例子2 (Example 2)

求出曲​​线下面积:f(x)= x 2 cos(x)-4≤x≤9。

创建一个脚本文件并编写以下代码 -

f = x^2*cos(x);
ezplot(f, [-4,9])
a = int(f, -4, 9)
disp('Area: '), disp(double(a));

运行该文件时,MATLAB绘制图形 -

定积分

输出如下 -

a = 
8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9)
Area: 
   0.3326

以下是Octave相当于上面的计算 -

pkg load symbolic
symbols
x = sym("x");
f = inline("x^2*cos(x)");
ezplot(f, [-4,9])
print -deps graph.eps
[a, ierror, nfneval] = quad(f, -4, 9);
display('Area: '), disp(double(a));

MATLAB - Polynomials

MATLAB将多项式表示为包含按降序幂排序的系数的行向量。 例如,等式P(x)= x 4 + 7x 3 - 5x + 9可表示为 -

p = [1 7 0 -5 9];

评估多项式

polyval函数用于评估指定值的多项式。 例如,要评估我们先前的多项式p ,在x = 4时,键入 -

p = [1 7 0  -5 9];
polyval(p,4)

MATLAB执行上述语句并返回以下结果 -

ans = 693

MATLAB还提供了用于评估矩阵多项式的polyvalm函数。 矩阵多项式是以矩阵为变量的polynomial

例如,让我们创建一个方矩阵X并在X处计算多项式p -

p = [1 7 0  -5 9];
X = [1 2 -3 4; 2 -5 6 3; 3 1 0 2; 5 -7 3 8];
polyvalm(p, X)

MATLAB执行上述语句并返回以下结果 -

ans =
      2307       -1769        -939        4499
      2314       -2376        -249        4695
      2256       -1892        -549        4310
      4570       -4532       -1062        9269

寻找多项式的根

roots函数计算多项式的根。 例如,要计算多项式p的根,请键入 -

p = [1 7 0  -5 9];
r = roots(p)

MATLAB执行上述语句并返回以下结果 -

r =
   -6.8661 + 0.0000i
   -1.4247 + 0.0000i
   0.6454 + 0.7095i
   0.6454 - 0.7095i

函数poly是根函数的反函数并返回多项式系数。 例如 -

p2 = poly(r)

MATLAB执行上述语句并返回以下结果 -

p2 =
   Columns 1 through 3:
      1.00000 + 0.00000i   7.00000 + 0.00000i   0.00000 + 0.00000i
   Columns 4 and 5:
      -5.00000 - 0.00000i   9.00000 + 0.00000i

多项式曲线拟合

polyfit函数找到以最小二乘意义拟合一组数据的多项式的系数。 如果x和y是包含要拟合为n次多项式的x和y数据的两个向量,那么我们通过写入得到拟合数据的多项式 -

p = polyfit(x,y,n)

例子 (Example)

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

x = [1 2 3 4 5 6]; y = [5.5 43.1 128 290.7 498.4 978.67];   %data
p = polyfit(x,y,4)   %get the polynomial
% Compute the values of the polyfit estimate over a finer range, 
% and plot the estimate over the real data values for comparison:
x2 = 1:.1:6;          
y2 = polyval(p,x2);
plot(x,y,'o',x2,y2)
grid on

运行该文件时,MATLAB显示以下结果 -

p =
   4.1056  -47.9607  222.2598 -362.7453  191.1250

并绘制以下图表 -

多项式曲线拟合

MATLAB - Transforms

MATLAB提供了使用变换的命令,例如拉普拉斯和傅里叶变换。 变换在科学和工程中用作简化分析和从另一个角度查看数据的工具。

例如,傅立叶变换允许我们将表示为时间函数的信号转换为频率函数。 拉普拉斯变换允许我们将微分方程转换为代数方程。

MATLAB提供laplacefourierfft命令,用于拉普拉斯,傅立叶和快速傅里叶变换。

拉普拉斯变换

时间f(t)函数的拉普拉斯变换由以下积分给出 -

拉普拉斯变换

拉普拉斯变换也表示为f(t)到F(s)的变换。 您可以看到此变换或积分过程将f(t)(符号变量t的函数)转换为另一个函数F(s),另一个变量为s。

拉普拉斯变换将微分方程转化为代数方程。 为了计算函数f(t)的拉普拉斯变换,写 -

laplace(f(t))

例子 (Example)

在这个例子中,我们将计算一些常用函数的拉普拉斯变换。

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

syms s t a b w
laplace(a)
laplace(t^2)
laplace(t^9)
laplace(exp(-b*t))
laplace(sin(w*t))
laplace(cos(w*t))

运行该文件时,它显示以下结果 -

ans =
   1/s^2
ans =
   2/s^3
ans =
   362880/s^10
ans =
   1/(b + s)
ans =
   w/(s^2 + w^2)
ans =
   s/(s^2 + w^2)

逆拉普拉斯变换

MATLAB允许我们使用命令ilaplace计算逆拉普拉斯变换。

例如,

ilaplace(1/s^3)

MATLAB将执行上述语句并显示结果 -

ans =
   t^2/2

例子 (Example)

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

syms s t a b w
ilaplace(1/s^7)
ilaplace(2/(w+s))
ilaplace(s/(s^2+4))
ilaplace(exp(-b*t))
ilaplace(w/(s^2 + w^2))
ilaplace(s/(s^2 + w^2))

运行该文件时,它显示以下结果 -

ans =
   t^6/720
ans =
   2*exp(-t*w)
ans =
   cos(2*t)
ans =
   ilaplace(exp(-b*t), t, x)
ans =
   sin(t*w)
ans =
   cos(t*w)

傅立叶变换

傅立叶变换通常将时间f(t)的数学函数变换为新函数,有时用F或F表示,其参数是频率,单位为周期/秒(赫兹)或每秒弧度。 然后,新函数被称为傅里叶变换和/或函数f的频谱。

例子 (Example)

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

syms x 
f = exp(-2*x^2);     %our function
ezplot(f,[-2,2])     % plot of our function
FT = fourier(f)      % Fourier transform

运行该文件时,MATLAB绘制以下图表 -

傅立叶变换

显示以下结果 -

FT =
   (2^(1/2)*pi^(1/2)*exp(-w^2/8))/2

将傅立叶变换绘制为 -

ezplot(FT)

给出以下图表 -

绘制傅里叶变换

逆傅里叶变换

MATLAB提供了用于计算函数的逆傅立叶变换的ifourier命令。 例如,

f = ifourier(-2*exp(-abs(w)))

MATLAB将执行上述语句并显示结果 -

f =
   -2/(pi*(x^2 + 1))

MATLAB - GNU Octave Tutorial

GNU Octave是一种高级编程语言,如MATLAB,它主要与MATLAB兼容。 它也用于数值计算。

Octave与MATLAB具有以下共同特征 -

  • 矩阵是基本数据类型
  • 它内置了对复杂数字的支持
  • 它有内置的数学函数和库
  • 它支持用户定义的功能

GNU Octave也是可自由再发行的软件。 您可以根据自由软件基金会发布的GNU通用公共许可证(GPL)的条款重新分发和/或修改它。

MATLAB与Octave

大多数MATLAB程序在Octave中运行,但是一些Octave程序可能无法在MATLAB中运行,因为Octave允许一些MATLAB没有的语法。

例如,MATLAB仅支持单引号,但Octave支持用于定义字符串的单引号和双引号。 如果您正在寻找关于Octave的教程,那么请从头开始阅读本教程,其中包括MATLAB和Octave。

兼容的例子

本教程中涉及的几乎所有示例都与MATLAB以及Octave兼容。 让我们在MATLAB和Octave中尝试以下示例,它可以产生相同的结果而无需任何语法更改 -

此示例为函数g = xe - (x 2 + y 2创建3D曲面图。 创建一个脚本文件并键入以下代码 -

[x,y] = meshgrid(-2:.2:2);
g = x .* exp(-x.^2 - y.^2);
surf(x, y, g)
print -deps graph.eps

运行该文件时,MATLAB显示以下三维地图 -

Matlab中的三维地图

Non-compatible Examples

虽然MATLAB的所有核心功能都可以在Octave中使用,但是有一些功能,例如差分和积分微积分,它们在两种语言中都不完全匹配。 本教程试图给出两种语法不同的示例。

考虑以下示例,其中MATLAB和Octave使用不同的函数来获得曲线的面积:f(x)= x 2 cos(x)对于-4≤x≤9。以下是MATLAB版本的代码 -

f = x^2*cos(x);
ezplot(f, [-4,9])
a = int(f, -4, 9)
disp('Area: '), disp(double(a));

运行该文件时,MATLAB绘制图形 -

定积分

显示以下结果

a =
8*cos(4) + 18*cos(9) + 14*sin(4) + 79*sin(9)
Area: 
   0.3326

但是要在Octave中给出相同曲线的区域,你必须使用symbolic包如下 -

pkg load symbolic
symbols
x = sym("x");
f = inline("x^2*cos(x)");
ezplot(f, [-4,9])
print -deps graph.eps
[a, ierror, nfneval] = quad(f, -4, 9);
display('Area: '), disp(double(a));

MATLAB - Simulink

Simulink是一个基于仿真和模型的动态和嵌入式系统设计环境,与MATLAB集成。 Simulink也是由MathWorks开发的,是一种用于建模,模拟和分析多域动态系统的数据流图形编程语言工具。 它基本上是一个图形化的框图工具,带有可自定义的块库集。

它允许您将MATLAB算法合并到模型中,并将仿真结果导出到MATLAB中以进行进一步分析。

Simulink支持 -

  • 系统级设计
  • simulation
  • 自动代码生成
  • 嵌入式系统的测试和验证

MathWorks提供了其他一些附加产品以及可与Simulink一起使用的第三方硬件和软件产品。

以下列表简要介绍了其中一些 -

  • Stateflow允许开发状态机和流程图。

  • Simulink Coder允许自动生成C源代码以实时实现系统。

  • xPC Targetx86-based real-time systems提供了一个在物理系统上实时模拟和测试Simulink和Stateflow模型的环境。

  • Embedded Coder支持特定的嵌入式目标。

  • HDL Coder允许自动生成可合成的VHDL和Verilog。

  • SimEvents提供了一个用于对排队系统进行建模的图形构建块库。

Simulink能够通过建模样式检查,需求可追溯性和模型覆盖分析对系统进行系统验证和验证。

Simulink Design Verifier允许您识别设计错误并生成用于模型检查的测试用例场景。

使用Simulink

要打开Simulink,请输入MATLAB工作区 -

simulink

Simulink使用Library Browser打开。 库浏览器用于构建仿真模型。

Simulink库浏览器

在左侧窗格中,您将找到基于各种系统分类的多个库,单击每个库将在右侧窗格中显示设计块。

建筑模型

要创建新模型,请单击“库浏览器”工具栏上的“ New按钮。 这将打开一个新的无标题模型窗口。

Simulink新模型窗口

Simulink模型是一个框图。

通过从库浏览器中选择适当的元素并将它们拖到“模型”窗口中,可以添加模型元素。

或者,您可以复制模型元素并将其粘贴到模型窗口中。

例子 (Examples)

从Simulink库中拖放项目以创建项目。

出于此示例的目的,将使用两个块进行模拟 - Source (信号)和Sink (范围)。 信号发生器(信号源)产生模拟信号,然后由示波器(接收器)以图形方式显示。

来源和汇

首先将所需的块从库拖动到项目窗口。 然后,将块连接在一起,这可以通过将连接器从一个块上的连接点拖动到另一个块上的连接点来完成。

让我们将“正弦波”块拖入模型中。

正弦波块

从库中选择“Sinks”并将“Scope”块拖到模型中。

范围块

将信号线从正弦波块的输出拖动到Scope块的输入。

块未连接

块已连接

按“ Run ”按钮运行模拟,保持所有参数默认(您可以从“模拟”菜单更改它们)

您应该从范围获得以下图表。

模拟
↑回到顶部↑
WIKI教程 @2018