matlab矩阵运算表达式动态解释扩展函数库
MATLAB常用矩阵函数
1. 矩阵的构造与操作zeros 生成元素全为0的矩阵ones 生成元素全为1的矩阵eye 生成单位矩阵rand 生成随机矩阵randn 生成正态分布随机矩阵sparse 生成稀疏矩阵full 将稀疏矩阵化为普通矩阵diag 对角矩阵tril 矩阵的下三角部分triu 矩阵的上三角部分flipud 矩阵上下翻转fliplr 矩阵左右翻转MATLAB还能够构造一些常用的特殊矩阵2. 矩阵运算函数norm 矩阵或向量范数normest 稀疏矩阵(或大规模矩阵)的2-范数估计rank 矩阵的秩det 方阵的行列式trace 方阵的迹null 求基础解系(矩阵的零空间)orth 正交规范化rref 矩阵的行最简形(初等行变换求解线性方程组)subspace 计算两个子空间的夹角3. 与线性方程有关的矩阵运算函数inv 方阵的逆cond 方阵的条件数condest 稀疏矩阵1-范数的条件数估计chol 矩阵的Cholesky分解(矩阵的平方根分解)cholinc 稀疏矩阵的不完全Cholesky分解linsolve 矩阵方程组的求解lu 矩阵的LU分解ilu 稀疏矩阵的不完全LU分解luinc 稀疏矩阵的不完全LU分解qr 矩阵的正交三角分解pinv 矩阵的广义逆4. 与特征值或奇异值有关的矩阵函数eig 方阵的特征值与特征向量svd 矩阵的奇异值分解eigs 稀疏矩阵的一些(默认6个)最大特征值与特征向量svds 矩阵的一些(默认6个)最大奇异值与向量hess 方阵的Hessenberg形式分解schur 方阵的Schur分解。
第2章MATLAB矩阵及其运算
·30·
第 2 章 MATLAB 矩阵及其运算
的求解方法时,因不完善的设计导致的内存溢出。在此,主要针对第二种情况进行分析并 给出相应的解决方案。
1.变量名区分大小写 变量名的定义必须符合以下条件: 必须以字母开头。 由字母、数字、下划线组成。 最长为 31 个字符。 一些用户不可以清除的变量,如 ans、eps、pi、Inf、NaN 等。 【例 2-1】 变量定义举例如下:
A a king
在 MATLAB 中的变量不需要事先定义,在遇见新的变量名时,MATLAB 会自动建立 并且为其分配存储空间。如果遇见已经出现的变量,会重新为其分配空间。
a = complex(2,9) b = real(a) c = imag(a)
MATLAB 运行结果如下:
a= 2.0000 + 9.0000i
b= 2
c= 9
3.除了可以把数值直接赋给变量,还可以将表达式、矩阵赋给变量
对于矩阵的讲解,会在后面详细讲解。 【例 2-4】 变量的赋值举例如下:
a=[1 4 7] B=abs(6+13i) C=[]
(4)不同数据结构的内存。 在 MATLAB 中,8 位、16 位、32 位、64 位的有符号整型或无符号整型分别占用 1、2、4、8 字节空间,单精度、双精度浮点数分别占用 4、8 字节空间。 在 MATLAB 中,复数的存储比较特殊。复数的实部和虚部在内存中是分开存放的, 当在程序中修改复数的实部或虚部时,会在修改数据的同时复制复数的实部和虚部。 在 MATLAB 中,当数组的元素绝大部分为 0 时,MATLAB 一般默认采用稀疏矩 阵进行存储以节省空间。
a=[1,2,3,4,5,6,7,8,9,10]
MATLAB矩阵及运算
点乘——元素对元素乘法 叉乘——矩阵对矩阵乘法
对比举例
矩阵的右除、左除
MATLAB的基本处理单元是复数矩阵(标量是一 个1*1的矩阵)。而在《线性代数》理论中没有除 法运算。所以定义了除法为乘法的逆运算。
注意:因为矩阵乘法不满足交换律,即一般 A*B≠B*A,所以除法要考虑“右除”、“左 除”。
2.1.2 变量
变量的命名规则: 1)变量名、函数名对字母的大、小写敏感。 2)变量名由字母、数字和下划线构成。第一个
字母必须是英文字母。 3)有字符个数限制(版本5.0 :最多31个字符)
2.1.2 变量
MATLAB系统默认变量
重点
(注意大小写!)
i或j:
虚单元 正确:5+7j 错误:5+j7
2.1表达式
表达式 (即语句):将变量、数值、函数 用操作符连接起来,就构成了表达式 。
例如:a=(10j+sqrt(10))/2; %注释 ☆行末的“;”用于抑制结果在屏幕上显示
例如: sin(a),sin(b) ,a+b ☆同在一行的表达式,必须用“,”分开
2.2 矩阵的产生与操作
矩阵的产生:
A./Baa31//b b1 3
a2/b2 a4/b4
B.\A
A.\Bbb31//aa13 bb42//aa42B./A
分析:
K/N=K*inv(N)
因为N不是方阵,没有逆 阵,所以报告错误。
K\N=inv(K)*N
因为K的逆阵尺寸2×2, N的尺寸2×3,所以结 果矩阵2×3。
矩阵元素的指数运算
这种战略取得了成功:使人们不在编程细节上化 精力,把注意力集中到科学计算的方法和建模合理性等 大问题上。
matlab里矩阵运算
matlab里矩阵运算
在MATLAB中,矩阵运算是非常方便且强大的。
下面是一些常见的矩阵运算操作:
1. 矩阵相加或相减:
matlab
C = A + B; % 矩阵A和B相加,结果存储在C中
D = A - B; % 矩阵A和B相减,结果存储在D中
2. 矩阵相乘:
matlab
C = A * B; % 矩阵A和B相乘,结果存储在C中
3. 矩阵与标量相乘或相除:
matlab
C = A * scalar; % 矩阵A与标量相乘,结果存储在C中
D = A / scalar; % 矩阵A与标量相除,结果存储在D中
4. 矩阵转置:
matlab
B = A.'; % 矩阵A的转置存储在B中
5. 矩阵求逆:
matlab
B = inv(A); % 矩阵A的逆矩阵存储在B中
6. 矩阵的点乘或点除:
matlab
C = A .* B; % 矩阵A和B对应元素相乘,结果存储在C中
D = A ./ B; % 矩阵A和B对应元素相除,结果存储在D中
这些只是矩阵运算中的一些基本操作,MATLAB还提供了更多高级的矩阵运算函数和工具,如特征值分解、奇异值分解、矩阵乘法、内积、外积等。
您可以进一步研究MATLAB的文档以了解更多相关函数和操作。
MATLAB之(一)数组、矩阵和函数及运算
说明 4位小数
3.14159265358979 15位小数
3.14
2位小数
355/113
最接近的有理数
format short e,t =pi 3.1416e+000
科学计数
format long e ,t =pi 四、函数
3.141592653589793e+000
MATLAB提供了大量的函数,按照起用法分为标量函数、 向量函数和矩阵函数。
14
b= 1 3 5 7
c=6:-3:-6(从6到-6公差为-3的等差数组)
c=
6 3 0 -3 -6 e=[0:2:8,ones(1,3)](等差数组和行向量的拼接)
e=
0 2468111
2数组的运算
数组除作为1×n矩阵(行向量)遵循矩阵运算外,
MATLAB还为数组提供了一些特殊运算。两个数组间的
的最重要特征是按元素进行运算。
2021/4/14
13
1 数组的输入 ⑴可以像1×n矩阵(即行向量)一样输入,如: a=[2,3,4,5] a=
2345
⑵数组常用“:”来方便地生成一些特殊的数组。如:
a=1:5(从1到5公差为1的等差数组)
a=
12345
b=1:2:7(从1到7公差为2的等差数组)
2021/4/14
(5) randn(生成正态分布随机矩阵); U=ones(3)
W=zeros(2,3) V=eye(2,4)
U=
W=
V=
111
000
2021/4/14
000
1000 0100
111
9
111
X=rand(2,3)
X=
MATLAB中的矩阵运算与计算技巧分享
MATLAB中的矩阵运算与计算技巧分享矩阵运算与计算技巧是MATLAB中非常重要的部分,它为用户提供了便捷的方法来处理和分析大量数据。
在本文中,我将分享一些在MATLAB 中进行矩阵运算和计算的技巧和方法。
1.矩阵创建和操作:MATLAB提供了多种方法来创建矩阵,如zeros函数创建全零矩阵、ones函数创建全一矩阵、eye函数创建单位矩阵等。
此外,还可以使用linspace函数创建等差数列构成的矩阵,或使用rand函数创建指定维度的随机数矩阵。
例如:A = zeros(3, 3) % 创建一个3x3的全零矩阵B = ones(2, 2) % 创建一个2x2的全一矩阵C = eye(3) % 创建一个3x3的单位矩阵D = linspace(1, 10, 5) % 创建一个从1到10的5个等差数列构成的矩阵E = rand(2, 2) % 创建一个2x2的随机数矩阵例如:A'%矩阵A的转置A(1:2,:)%取矩阵A的前两行[A,B]%将矩阵A和B沿着列方向拼接2.矩阵运算:例如:A+B%矩阵A和B的加法运算A-B%矩阵A和B的减法运算A*B%矩阵A和B的乘法运算A/B%矩阵A和B的除法运算A^2%矩阵A的平方3.矩阵函数:例如:inv(A) % 求矩阵A的逆矩阵eig(A) % 求矩阵A的特征值和特征向量rank(A) % 求矩阵A的秩det(A) % 求矩阵A的行列式4.矩阵索引和迭代:例如:A(1,1)%访问矩阵A的第一个元素A(2:3,2)%访问矩阵A的第2到3行的第2列元素for i = 1:size(A, 1)for j = 1:size(A, 2)A(i,j)=A(i,j)+1;%对矩阵A的每个元素加1endend5.矩阵运算的向量化:例如,可以使用矩阵运算代替for循环来实现向量的加法:A=[1,2,3];B=[4,5,6];C=A+B;以上只是MATLAB中矩阵运算与计算技巧的一部分,MATLAB还提供了许多其他功能和工具,如线性代数运算、矩阵分解、矩阵方程的求解等。
matlab中expand函数的用法
matlab中expand函数的用法在MATLAB中,expand函数是用于展开代数表达式的函数。
它可以将方程或表达式中的复合项展开为多项式形式,从而更方便地进行计算和分析。
在本文中,我们将详细介绍MATLAB中expand函数的用法,并通过实例演示其功能和应用。
1. expand函数的基本语法在MATLAB中,expand函数的基本语法如下所示:```matlabA = expand(B)```其中,B表示待展开的代数表达式,A表示展开后的结果。
2. 展开代数表达式expand函数可以将代数表达式展开为多项式的形式。
例如,我们有以下代数表达式:```matlabsyms xexpr = (x + 1)^3```现在,我们要使用expand函数将其展开:expanded_expr = expand(expr)```执行以上代码,我们得到展开后的结果:```matlabexpanded_expr =x^3 + 3*x^2 + 3*x + 1```可以看到,expand函数将(x + 1)^3展开为了x^3 + 3*x^2 + 3*x + 1的形式。
除了多项式展开外,expand函数还可以对其他类型的代数表达式进行展开,例如符号表达式、分式等。
3. expand函数的其他应用expand函数不仅可以展开代数表达式,还可以进行因式分解和配方等操作。
接下来,我们将通过实例演示expand函数在这些方面的应用。
3.1 因式分解在MATLAB中,可以使用expand函数对代数表达式进行因式分解。
例如,我们有以下代数表达式:```matlabexpr = x^3 + 3*x^2 + 3*x + 1```现在,我们要使用expand函数进行因式分解:```matlabfactored_expr = factor(expand(expr))```执行以上代码,我们得到因式分解后的结果:```matlabfactored_expr =(x + 1)^3```可以看到,expand函数先将代数表达式展开为多项式形式,然后通过factor函数进行因式分解,最后得到了原始表达式。
matlab02_Matrix矩阵运算
—— 矩阵运算
1
本讲主要内容
Kronecker 乘积
数组运算 函数的使用 变量的输入输出
2
Kronecker 乘积
矩阵 Kronecker 乘积的定义
设 A 是 n×m 矩阵,B 是 p×q 矩阵,则 A 与 B 的 kronecker 乘积为:
a11 B a12 B a B a B 22 C A B 21 an1 B an 2 B a1m B a2 m B anm B
17
上机作业
1、自己练习,体会各种数学函数的使用 (不用上交) 2、写出可以完成下列任务的Matlab命令 (需上交) :
(1)生成列向量 x = [10-10,10-9, ..., 10-1, 1, 2, 4, 6, 8, … , 80] (2)数列 x 同(1),求数列 y 使得 yi=sin(xi)/xi (3)产生一个 1 到 10 的随机整数排列 S1(参见教材 P143-144) (4)产生一个含有10 个不超过 10 的随机均匀整数的序列 S2 (参见教材 P143-144), 问:S1与S2是否相同? (5)利用函数 rand 生成一个含有满足均匀分布的 4 阶随机整数方阵A, 元素都是 0~100 之间的整数 (6)生成一个与 A 同阶的满足正态分布的随机矩阵 B (7)计算 A 的转置 与 B 的下三角部分的 kronecker 乘积 C (8)生成由 B 与其同阶魔方矩阵点乘得到的矩阵 D (9)求出矩阵 D 中绝对值最大的元素的绝对值 (10)删除 D 的第三行和第二列 (11)生成由 B 的第 2, 4, 5 行和第 4, 1, 4 列组成的子矩阵 E 18 (12)教材第 53 页,第 1 题(1-5)和第 5 题
MATLAB数学函数库的使用方法与案例
MATLAB数学函数库的使用方法与案例概述:在科学计算领域中,MATLAB被广泛应用于数据分析、数值模拟等任务。
作为一种强大的数学计算软件,MATLAB提供了丰富的数学函数库,使得用户能够更便捷地进行数学运算。
本文将介绍一些常用的MATLAB数学函数库以及它们的使用方法,并结合具体案例进行解析。
1. 数学变换函数:MATLAB提供了众多的数学变换函数,包括傅里叶变换、离散傅里叶变换、卷积等。
这些函数可以高效地处理信号处理任务。
举个例子,我们可以使用MATLAB的fft函数进行快速傅里叶变换(FFT)。
```matlabx = [1, 2, 3, 4]; % 原始信号X = fft(x); % 快速傅里叶变换```上述代码中,我们定义了一个简单的信号x,然后使用fft函数对其进行傅里叶变换。
变换的结果存储在X变量中,可以用于后续的信号处理任务。
2. 矩阵运算函数:矩阵运算在科学计算中非常重要,而MATLAB提供了一系列方便的矩阵运算函数。
例如,我们可以使用MATLAB的inv函数计算矩阵的逆。
```matlabA = [1, 2; 3, 4]; % 输入矩阵inv_A = inv(A); % 计算矩阵的逆```上述代码中,我们定义了一个2x2的矩阵A,并使用inv函数计算其逆矩阵。
逆矩阵存储在inv_A变量中,可以用于进一步的数值计算。
3. 数值积分函数:在数值计算中,积分是一项重要的任务。
MATLAB提供了多种数值积分函数,包括高斯积分、辛普森积分等。
我们可以使用MATLAB的integral函数来计算定积分。
```matlabf = @(x) x^2; % 被积函数integral_result = integral(f, 0, 1); % 计算定积分```上述代码中,我们首先定义了一个被积函数f(x)=x^2,然后使用integral函数计算其在0到1之间的定积分。
积分的结果存储在integral_result变量中。
matlab改变矩阵的行和列的函数
matlab改变矩阵的行和列的函数MATLAB中有许多内置的函数可以用来改变矩阵的行和列。
这些函数可以帮助我们实现各种矩阵操作,包括交换行和列的位置,增加和删除行和列,以及重塑矩阵的维度。
在本文中,我将为您介绍一些常用的函数及其用法。
1.交换行和列的位置可以使用MATLAB中的`transpose`函数来交换矩阵的行和列。
它的用法是`B = transpose(A)`,其中A是原始矩阵,B是转置后的矩阵。
例如,如果我们有一个3x4的矩阵A,我们可以使用`B = transpose(A)`来交换其行和列。
2.增加和删除行和列可以使用MATLAB中的`cat`函数来增加或删除矩阵的行和列。
该函数的用法是`B = cat(dim, A, C)`,其中dim是指定要增加或删除的维度,A是原始矩阵,C是要增加或删除的行或列。
例如,如果我们有一个3x4的矩阵A和一个2x4的矩阵C,我们可以使用`B = cat(1, A, C)`来增加一个2x4的矩阵C的行到矩阵A的下方;使用`B = cat(2, A, C)`来增加一个2x4的矩阵C的列到矩阵A的右侧。
要删除矩阵的行,可以使用MATLAB中的`A(row,:) = []`语法,其中row是要删除的行的索引。
例如,如果我们要删除矩阵A的第2行,我们可以使用`A(2,:) = []`。
要删除矩阵的列,可以使用MATLAB中的`A(:,col) = []`语法,其中col是要删除的列的索引。
例如,如果我们要删除矩阵A的第3列,我们可以使用`A(:,3) = []`。
3.重塑矩阵的维度可以使用MATLAB中的`reshape`函数来重塑矩阵的维度。
该函数的用法是`B = reshape(A, m, n)`,其中A是原始矩阵,m和n是要重塑的行和列的数量。
例如,如果我们有一个12x1的矩阵A,我们可以使用`B = reshape(A, 3, 4)`来将其重塑为一个3x4的矩阵B。
matlab中expand函数的用法
matlab中expand函数的用法引言:在MATLAB中,expand函数是一个非常有用的工具,它可以用于展开代数表达式。
通过使用expand函数,我们可以将代数表达式展开为更简单的形式,以便于进一步的计算和分析。
本文将详细介绍MATLAB中expand函数的用法和应用。
正文:1. 展开代数表达式的基本概念1.1 代数表达式的定义代数表达式是由变量、常数和运算符组成的数学表达式,例如多项式、分式等。
1.2 展开代数表达式的意义展开代数表达式可以将复杂的表达式转化为更简单的形式,以便于进行计算和分析。
2. MATLAB中expand函数的基本用法2.1 expand函数的语法expand(expr):将代数表达式expr展开为更简单的形式。
2.2 expand函数的参数expr:要展开的代数表达式。
2.3 expand函数的返回值返回展开后的代数表达式。
3. expand函数的具体应用3.1 展开多项式表达式通过使用expand函数,我们可以将多项式表达式展开为多个项的和的形式,以便于进一步的计算和分析。
3.2 展开分式表达式expand函数还可以用于展开分式表达式,将其展开为更简单的形式,以便于进行计算和分析。
3.3 展开三角函数表达式对于包含三角函数的表达式,expand函数可以将其展开为更简单的形式,以便于进行求导、积分等操作。
4. expand函数的高级用法4.1 设置展开的级数通过设置expand函数的级数参数,我们可以控制展开的级数,以满足不同的需求。
4.2 控制展开的变量expand函数还可以通过设置变量参数,控制展开的变量,以满足不同的需求。
总结:通过本文的介绍,我们了解了MATLAB中expand函数的用法和应用。
它可以用于展开代数表达式,将复杂的表达式转化为更简单的形式,以便于进行计算和分析。
我们还了解了expand函数的基本用法和具体应用,以及其高级用法。
掌握expand函数的使用,将有助于我们更高效地进行代数计算和分析工作。
Matlab中矩阵函数
矩阵转置用符号“`”来表示和实现。
例如:A=[1 2 3;4 5 6 ;7 8 9 ];B=A`↙B=1 4 72 5 83 6 9如故Z是复数矩阵,则Z`为它们的复数共轭转置矩阵,非共轭转置矩阵使用Z.`或conj(Z`)。
size(a)[d1,d2,d3,..]=size(a) 求矩阵的大小,对m*n二维矩阵,第一个为行数m,第二个为列数n;对多维矩阵,第N个为矩阵第N维的长度。
cat(k,a,b) 矩阵合并,运行a = magic(3)b = pascal(3)c = cat(4,a,b)改4为3或2或1,自己体会合并后的效果。
k=1,合并后形如[a;b],行添加矩阵(要求a,b的列数相等才能合并);k=2,合并后形如[a,b],列添加矩阵(要求a,b的行数相等才能合并),以此类推,n维的矩阵合并,要求n-1维维数相等才可以)。
fliplr(a) 矩阵左右翻转flipud(a) 矩阵上下翻转rot90(a)rot90(a,k) 矩阵逆时针旋转90度(把你的头顺时针旋转90看原数就可以知道结果了,^-^)k参数定义为逆时针旋转90*k度。
flipdim(a,k) 矩阵对应维数数值翻转,如k=1时,行(上下)翻转,k=2时,列(左右)翻转。
tril(a)tril(a,k) 矩阵的下三角部分(包括对角线元素),对应k=0时的取值数。
k参数设置为正负数值对应对角线向上或向下移动k行划分下三角元素。
triu(a)tril(a,k) 矩阵的上三角部分(包括对角线元素),对应k=0时的取值数。
k参数设置为正负数值对应对角线向上或向下移动k行划分上三角元素。
diag(a)diag(a,k) 生成对角矩阵或取出对角元素,对应k=0时的取值数。
k参数设置为正负数值对应对角线向上或向下移动k行取对角元素或生成对角矩阵。
repmat(a,m,n) 矩阵复制,把矩阵a作为一个单位计算,复制成m*n 的矩阵,其每一元素都含一个矩阵a,实际结果为一个size(a,1)*m行,size(a,2)*n列的矩阵。
matlab矩阵位运算
matlab矩阵位运算在数学和计算机科学中,矩阵是一种非常重要的数据结构。
它由行和列组成,可以用来表示和处理各种类型的数据。
而位运算是一种对二进制数进行操作的方法,它可以对矩阵中的每个元素进行逐位操作。
在matlab中,矩阵位运算可以通过一些内置函数来实现。
matlab中的位运算函数主要有bitand、bitor、bitxor和bitcmp。
这些函数可以对矩阵中的每个元素进行逐位的与、或、异或和取反操作。
下面我们来具体介绍一下这些函数的用法。
首先是bitand函数,它可以对两个矩阵进行逐位的与操作。
例如,我们有两个矩阵A和B,它们的大小相同。
我们可以使用bitand(A, B)来计算A和B的逐位与结果。
这个函数会返回一个新的矩阵,其中的每个元素都是A和B对应位置上的元素进行与操作的结果。
接下来是bitor函数,它可以对两个矩阵进行逐位的或操作。
与bitand函数类似,我们可以使用bitor(A, B)来计算A和B的逐位或结果。
这个函数也会返回一个新的矩阵,其中的每个元素都是A和B对应位置上的元素进行或操作的结果。
然后是bitxor函数,它可以对两个矩阵进行逐位的异或操作。
我们可以使用bitxor(A, B)来计算A和B的逐位异或结果。
这个函数同样会返回一个新的矩阵,其中的每个元素都是A和B对应位置上的元素进行异或操作的结果。
最后是bitcmp函数,它可以对矩阵中的每个元素进行逐位的取反操作。
我们可以使用bitcmp(A)来计算A的逐位取反结果。
这个函数同样会返回一个新的矩阵,其中的每个元素都是A对应位置上的元素进行取反操作的结果。
除了这些基本的位运算函数,matlab还提供了一些其他的位运算函数,如bitshift、bitset和bitget等。
这些函数可以对矩阵中的每个元素进行位移、设置和获取操作。
它们可以帮助我们更加灵活地处理矩阵中的位运算问题。
总结起来,matlab提供了一系列强大的矩阵位运算函数,可以对矩阵中的每个元素进行逐位的与、或、异或和取反操作。
Matlab矩阵运算介绍
Matlab 矩阵运算说明:这一段时间用Matlab做了LDPC码的性能仿真,过程中涉及了大量的矩阵运算,本文记录了Matlab中矩阵的相关知识,特别的说明了稀疏矩阵和有限域中的矩阵。
Matlab的运算是在矩阵意义下进行的,这里所提到的是狭义上的矩阵,即通常意义上的矩阵。
目录第一部分:矩阵基本知识一、矩阵的创建1.直接输入法2.利用Matlab函数创建矩阵3.利用文件创建矩阵二、矩阵的拆分1.矩阵元素2.矩阵拆分3.特殊矩阵三、矩阵的运算1.算术运算2.关系运算3.逻辑运算四、矩阵分析1.对角阵2.三角阵3.矩阵的转置与旋转4.矩阵的翻转5.矩阵的逆与伪逆6.方阵的行列式7.矩阵的秩与迹8.向量和矩阵的范数9.矩阵的特征值与特征向量五、字符串六、其他第二部分矩阵的应用一、稀疏矩阵1.稀疏矩阵的创建2.稀疏矩阵的运算3.其他二、有限域中的矩阵内容第一部分:矩阵基本知识(只作基本介绍,详细说明请参考Matlab帮助文档)矩阵是进行数据处理和运算的基本元素。
在MATLAB中a、通常意义上的数量(标量)可看成是”1*1″的矩阵;b、n维矢量可看成是”n*1″的矩阵;c、多项式可由它的系数矩阵完全确定。
一、矩阵的创建在MATLAB中创建矩阵有以下规则:a、矩阵元素必须在”[ ]“内;b、矩阵的同行元素之间用空格(或”,”)隔开;c、矩阵的行与行之间用”;”(或回车符)隔开;d、矩阵的元素可以是数值、变量、表达式或函数;e、矩阵的尺寸不必预先定义。
下面介绍四种矩阵的创建方法:1、直接输入法最简单的建立矩阵的方法是从键盘直接输入矩阵的元素,输入的方法按照上面的规则。
建立向量的时候可以利用冒号表达式,冒号表达式可以产生一个行向量,一般格式是: e1:e2:e3,其中e1为初始值,e2为步长,e3为终止值。
还可以用linspace函数产生行向量,其调用格式为:linspace(a,b,n) ,其中a和b 是生成向量的第一个和最后一个元素,n是元素总数。
MATLAB矩阵运算
MATLAB矩阵运算1. 矩阵的加减乘除和(共轭)转置(1) 矩阵的加法和减法 如果矩阵A和B有相同的维度(⾏数和列数都相等),则可以定义它们的和A+B以及它们的差A-B,得到⼀个与A和B同维度的矩阵C,其中C ij=A ij+B ij或A ij-B ij.另外Matlab还⽀持任意⼀个矩阵A与⼀个标量s相加,结果为矩阵的每⼀个元素加减标量,得到⼀个与A同维度的新的矩阵,即A+s的各个元素为A ij+s.(2) 矩阵的乘法 如果矩阵A的列数等于矩阵B的⾏数,则可以将A和B相乘,命令为A*B,得到⼀个新的矩阵C,C的⾏数等于A的⾏数,列数等于B的列数. 由于矩阵的乘法不满⾜交换律,所以⼀般A*B不等于B*A.(3) 矩阵的张量积(tensor product) 矩阵A和B的张量积A⊗B可以⽅便地⽤kron函数计算,即使⽤命令kron(A,B), 例如(4) 矩阵的除法 在MatLab中,有两个矩阵除法符号,左除\和右除/. 如果A是⼀个⾮奇异⽅阵(nonsingular square, 即满秩⽅阵),B的⾏数与A的⾏数相等,那么A\B=A-1B. 如果C的列数与A的列数相等,那么C/A=CA-1. 从另⼀个⾓度来看,X=A\B是矩阵⽅程AX=B的解,X=C/A是矩阵⽅程XA=C的解. 如果b是⼀个⾏数与A的⾏数相等的列向量,则向量x=A\b是线性⽅程组 Ax=b的解. 且在矩阵⽅程AX=B中,A可以是⼀个m×n的矩阵,如果m=n则有唯⼀解;如果m<n则有多个解,Matlab会返回⼀个基础解;如果m>n则会返回⼀个最⼩⽅阵解.(5) 矩阵的转置和共轭转置 在Matlab中,矩阵的共轭转置⽤撇号’表⽰,如果不需要对元素进⾏共轭运算,仅仅只对矩阵进⾏转置,则在撇号之前输⼊⼀个点号,即.’ . 对于实数矩阵A,A’和A.’是相同的.2. 矩阵元素操作运算 矩阵的运算既可以是如前所述的正常的整体运算,也可以是矩阵对应的元素依次进⾏标量运算,也叫数组运算,即把矩阵看做是⼆维数组. 对矩阵进⾏数组运算后得到的结果是⼀个与参与运算的矩阵维度相同的新矩阵,.这种元素间的算术运算的前提是参与运算的两个矩阵的维数要相同.对于加法和减法,元素操作运算和矩阵运算没有差别,⽽对于乘、除和幂运算符,相应的数组运算符是在⼀般的算术运算符前⾯加上⼀个点号,如+ - .* ./ .\ .^其中,A./B 是指A中的元素除以B中相应的元素,即A./B 的第i⾏第j列的元素(A./B)ij=A ij/B ij,⽽(A.\B)ij=B ij\A ij. 这些元素运算符的使⽤例⼦如下所⽰: 在Matlab中预定义的数学标准函数,如sin(x), abs(x)等都是基于对矩阵元素的运算. 如果函数f(x)是这样的⼀个函数,A是⼀个m×n的矩阵,其元素是a ij ,那么 f(A)也是⼀个m×n的矩阵,其第i⾏第j列的元素为f(a ij),例如其中pi是Matlab的预定义变量,值为π,i也是预定义变量,表⽰复数的单位.3. 常⽤的矩阵函数 矩阵函数是指参数为矩阵的函数,函数结果可能是⼀个标量值也可能是⼀个函数或者向量. Matlab中常⽤的矩阵函数包括: (1) rank(A): 求矩阵A的秩,即A中线性⽆关的⾏数或者线性⽆关的列数. (2) det(A): 求矩阵A的⾏列式值. (3) inv(A): 如果A是⼀个⾮奇异(nonsingular)矩阵,则inv(A)返回A的逆矩阵. 另外还可以⽤左除A\eye(n)或右除eye(n)/A来计算A的逆,且在Matlab中⽤左除或右除来计算逆所花的计算时间⽐⽤inv函数要少,也⽐inv具有更好的容错性(error-detection properties). (4) dot(x,y): 求同维度的向量x和y的内积/点积. 若A和B是两个具有相同维度的矩阵,则dot(A,B)是计算A和B对应列的内积,结果是⼀个⾏向量,这个⾏向量的列数等于A或B的列数. 例如 (5) cross(x,y): 计算同维度的向量x和y的叉积,结果是⼀个向量,其⽅向由右⼿定则决定,长度等于|x|*|y|sin<x,y>. 若A和B是两个具有相同维度的矩阵,则cross(A,B)是计算A和B对应列的叉积,结果是⼀个维度与A和B相等的矩阵. (6) kron(A,B): 得到矩阵A和B的张量积. (7) isequal(A,B): 如果矩阵A和B是相同的,即具有相同的维数和相同的内容,则返回1. (8) isreal(A): 判断A是否是⼀个实矩阵,如果是则返回1,否则返回0. (9) trace(A): 计算⽅阵A的迹,即对⾓线元素之和. (10) eig(A): 计算⽅阵A的特征值,结果是⼀个列向量,向量中元素的个数等于特征值的个数,即A的维度(A的⾏数或列数). (11) [U,D]=eig(A): 计算⽅阵A的特征值和特征向量,得到两个⽅阵U和D,其中D的对⾓线元素为A的特征值,U的列向量为A的特征向量(可能是未normalize的结果),例如 (12) length(V): 求向量V的长度,即V的元素数量. (14) size(A): 若A是m⾏n列的矩阵,则返回⾏向量[m,n].。
MATLAB中的矩阵运算函数
MATLAB中的矩阵运算函数1,round函数函数简介调用格式:Y = round(X)在matlab中round也是一个四舍五入函数。
对数组A中每个元素朝最近的方向取整数部分,并返回与A同维的整数数组B,对于一个复数参量A,则分别对其实部和虚数朝最近的方向取整数部分,并返回一复数数据B。
(1)fix(x) : 截尾取整.>>fix( [3.12 -3.12])ans =3 -3(2)floor(x):不超过x 的最大整数.(高斯取整)>>floor( [3.12 -3.12])ans =3 -4(3)ceil(x) : 大于x 的最小整数>>ceil( [3.12 -3.12])ans =4 -3(4)四舍五入取整>> round(3.12 -3.12)ans =0>> round([3.12 -3.12])ans =3 -32,reshape函数:重新调整矩阵的行数、列数、维数先给上一段代码:>> a=[1 2 3;4 5 6;7 8 9;10 11 12];>> b=reshape(a,2,6);这段代码的结果是这样的:>>a1 2 34 5 67 8 910 11 12>>b1 72 83 94 105 116 12对于 b=reshape(a,m,n);其中的规律是这样的,先把矩阵a按列拆分,然后拼接成一个大小为m*n的向量。
然后对这个向量每隔m间隔取一个元素组成一个向量b_i,之后的向量b_i+1也是这样生成,只不过第一个元素往下移一位。
这样做完之后得到m个大小为n的行向量,将这些行向量拼接即可得到矩阵b。
3,取模(mod)与取余(rem)通常取模运算也叫取余运算,它们返回结果都是余数.rem和mod 唯一的区别在于:当x和y的正负号一样的时候,两个函数结果是等同的;当x和y的符号不同时,rem 函数结果的符号和x的一样,而mod和y一样。
Matlab用法中矩阵简介
Matlab用法中矩阵简介绪论Matlab是“Matrix Laboratory”的缩写,意为“矩阵实验室”,是当今美国很流行的科学计算软件.信息技术、计算机技术发展到今天,科学计算在各个领域得到了广泛的应用.在许多诸如控制论、时间序列分析、系统仿真、图像信号处理等方面产生了大量的矩阵及其相应的计算问题.自己去编写大量的繁复的计算程序,不仅会消耗大量的时间和精力,减缓工作进程,而且往往质量不高.美国Mathwork软件公司推出的Matlab软件就是为了给人们提供一个方便的数值计算平台而设计的.Matlab是一个交互式的系统,它的基本运算单元是不需指定维数的矩阵,按照IEEE的数值计算标准(能正确处理无穷数Inf(Infinity)、无定义数NaN(not-a-number)及其运算)进行计算.系统提供了大量的矩阵及其它运算函数,可以方便地进行一些很复杂的计算,而且运算效率极高.Matlab命令和数学中的符号、公式非常接近,可读性强,容易掌握,还可利用它所提供的编程语言进行编程完成特定的工作.除基本部分外,Matlab还根据各专门领域中的特殊需要提供了许多可选的工具箱,如应用于自动控制领域的Control System工具箱和神经网络中Neural Network工具箱等.第一节Matlab的安装及使用§1.1 Matlab的安装Matlab有各种版本,早期有Matlab 1.0 for 386的DOS版本,后来逐步发展.这里介绍的版本是Matlab 6.x for Windows.因为它使用方便,界面美观,我们选择它作为主要讲解版本.Matlab还有许多附加的部分,最常见的部分称为Simulink,是一个用作系统仿真的软件包,它可以让您定义各种部件,定义各自对某种信号的反应方式及与其它部件的连接方式.最后选择输入信号,系统会仿真运行整个模拟系统,并给出统计数据.Simulink有时是作为Matlab的一部分提供的,称为Matlab with Simulink版本.Matlab还有许多工具箱,它们是根据各个特殊领域的需要,用Matlab自身的语言编写的程序集,使用起来非常方§1.2 Matlab基本用法从Windows中双击Matlab图标,会出现Matlab命令窗口(Command Window),在一段提示信息后,出现系统提示符“>>”.Matlab是一个交互系统,您可以在提示符后键入各种命令,通过上下箭头可以调出以前打入的命令,用滚动条可以查看以前的命令及其输出信息.如果对一条命令的用法有疑问的话,可以用Help菜单中的相应选项查询有关信息,也可以用help命令在命令行上查询,您可以试一下help、help help和help eig(求特征值的函数)命令.下面我们先从输入简单的矩阵开始掌握Matlab的功能.§1.2.1输入简单的矩阵输入一个小矩阵的最简单方法是用直接排列的形式.矩阵用方括号括起,元素之间用空格或逗号分隔,矩阵行与行之间用分号分开.例如输入:A=[1 2 3 ; 4 5 6 ; 7 8 0]系统会回答A =1 2 34 5 67 8 0表示系统已经接收并处理了命令,在当前工作区内建立了矩阵A.大的矩阵可以分行输入,用回车键代替分号,如:A=[ 1 2 34 5 67 8 0 ]结果和上式一样,也是A =1 2 34 5 67 8 0§1.2.2矩阵元素Matlab的矩阵元素可以是任何数值表达式.如:x=[ -1.3 sqrt(3) (1+2+3)*4/5]结果:x =-1.3000 1.7321 4.8000在括号中加注下标,可取出单独的矩阵元素.如:x(5)=abs(x(1))结果x =-1.3000 1.7321 4.8000 0 1.3000注:结果中自动产生了向量的第5个元素,中间未定义的元素自动初始为零.大的矩阵可把小的矩阵作为其元素来完成,如:A=[A; [10 11 12]]结果A =1 2 34 5 67 8 010 11 12小矩阵可用“:”从大矩阵中抽取出来,如:A=A(1:3,:);即从A中取前三行和所有的列,重新组成原来的A. (详细介绍参见第二节的相关内容)§1.2.3语句和变量Matlab的表述语句、变量的类型说明由Matlab系统解释和判断.Matlab语句通常形式为:变量=表达式或者使用其简单形式为:表达式表达式由操作符或其它特殊字符、函数和变量名组成.表达式的结果为一个矩阵,显示在屏幕上,同时保存在变量中以留用.如果变量名和“=”省略,则具有ans名(意思指回答)的变量将自动建立.例如:键入1900/81结果为:ans =23.4568需注意的问题有以下几点:*语句结束键入回车键,若语句的最后一个字符是分号,即“;”,则表明不输出当前命令的结果.*如果表达式很长,一行放不下,可以键入“…”(三个点,但前面必须有个空格,目的是避免将形如“数2 …”理解为“数2.”与“..”的连接,从而导致错误),然后回车.*变量和函数名由字母加数字组成,但最多不能超过63个字符,否则系统只承认前63个字符.*Matlab变量字母区分大小写,如A和a不是同一个变量,函数名一般使用小写字母,如inv(A)不能写成INV(A),否则系统认为未定义函数.§1.2.4 who和系统预定义变量输入who命令可检查工作空间中建立的变量,键入:who系统输出为:Your variables are:A ans x这里表明三个变量已由前面的例子产生了.但列表中列出的并不是系统全部的变量,系统还有以下内部变量:eps、pi、Inf、NaN变量eps在决定诸如矩阵的奇异性时,可作为一个容许差,容许差的初值为1.0到1.0以后计算机所能表示的下一个最大浮点数,IEEE在各种计算机、工作站和个人计算机上使用这个算法.用户可将此值置为任何其它值(包括0值).Matlab的内部函数pinc和rank以eps为缺省的容许差.变量pi是 ,它是用imag(log(-1))建立的.Inf表示无穷大.如果您想计算1/0S=1/0结果会是Warning:Divide by zeroS=Inf具有IEEE规则的机器,被零除后,并不引出出错条件或终止程序的运行,而产生一个警告信息和一个特殊值在计算方程中列出来.变量NaN表示它是个不定值.由Inf/Inf或0/0运算产生.要了解当前变量的信息请键入whos,屏幕将显示:Name Size Bytes ClassA 4x3 96 double arrayS 1x1 8 double arrayans 1x1 8 double arrayx 1x5 40 double arrayGrand total is 19 elements using 152 bytes从size及bytes项目可以看出,每一个矩阵实元素需8个字节的内存.4×3的矩阵使用96个字节,全部变量的使用内存总数为152个字节.自由空间的大小决定了系统变量的多少,如计算机上有虚拟内存的话,其可定义的变量个数会大大增加.§1.2.5数和算术表达式Matlab中数的表示方法和一般的编程语言没有区别.如:3 -99 0.00019.63972 1.6021E-20 6.02252e23在计算中使用IEEE浮点算法其舍入误差是eps.浮点数表示范围是10-308~10308.数学运算符有:+ 加- 减* 乘/ 右除\ 左除^ 幂这里1/4和4\1有相同的值都等于0.25(注意比较:1\4=4).只有在矩阵的除法时左除和右除才有区别.§1.2.6复数与矩阵在Matlab中输入复数首先应该建立复数单位:i=sqrt(-1)及j=sqrt(-1)之后复数可由下面语句给出:Z=3+4i (注意:在4与i之间不要留有任何空间!)输入复数矩阵有两个方便的方法,如:A=[1 2; 3 4] + i*[5 6; 7 8]和A=[1+5i 2+6i; 3+7i 4+8i]两式具有相等的结果.但当复数作为矩阵的元素输入时,不要留有任何空间,如1+5i,如在“+”号左右留有空格,就会被认为是两个分开的数.不过实际使用复数时并没有这么麻烦,系统有一个名为startup.m的Matlab命令文件,建立复数单位的语句也放在其中.当Matlab启动时,此文件自动执行,i和j将自动建立.§1.2.7输出格式任何Matlab语句执行结果都可在屏幕上显示,同时赋给指定的变量,没有指定变量时赋给ans.数字显示格式可由format命令来控制(Windows系统下的Matlab系统的数字显示格式可以由Option菜单中的Numerical Format菜单改变).format仅影响矩阵的显示,不影响矩阵的计算与存贮.(Matlab以双精度执行所有的运算)首先,如果矩阵元素是整数则矩阵显示就没有小数,如x=[-1 0 1],结果为:x=-1 0 1x=[4/3 1.2345e-6]在不同的输出格式下的结果为:短格式 1.3333 0.0000短格式e方式 1.3333e+000 1.234e-006长格式 1.333333333333333 0.000001234500000长格式e方式 1.333333333333333e-000 1.23450000000000e-006有理数格式4/3 1/81004516进制格式3ff5555555555555 3eb4b6231abfd271+格式+ +对于短格式,如果矩阵的最大元素比数999999999大,或者比数0.0001小,则在打印时,将加入一个普通的长度因数.如y=1.e20*x,意为x被1020乘,结果为:y=1.0e+020*1.3333 0.0000“+”格式是显示大矩阵的一种紧凑方法,“+”,“-”和空格显示正数、负数和零元素.最后format compact命令压缩显示的矩阵,以允许更多的信息显示在屏幕上.§1.2.8 Help求助命令和联机帮助Help求助命令很有用,它对Matlab大部分命令提供了联机求助信息.您可以从Help 菜单中选择相应的菜单,打开求助信息窗口查询某条命令,也可以直接用help命令.键入help得到help列表文件,键入“help 指定项目”,如:键入help eig则提供特征值函数的使用信息.键入help [显示如何使用方括号等.键入help help显示如何利用help本身的功能.还有,键入lookfor <关键字>:可以从m文件的help中查找有关的关键字.§1.2.9 退出和存入工作空间退出Matlab可键入quit或exit或选择相应的菜单.中止Matlab运行会引起工作空间中变量的丢失,因此在退出前,应键入save命令,保存工作空间中的变量以便以后使用.键入save则将所有变量作为文件存入磁盘Matlab.mat中,下次Matlab启动时,键入load将变量从Matlab.mat中重新调出.save和load后边可以跟文件名或指定的变量名,如仅有save时,则只能存入Matlab.mat 中.如save temp命令,则将当前系统中的变量存入temp.mat中去,命令格式为:save temp x 仅仅存入x变量.save temp X Y Z 则存入X、Y、Z变量.load temp可重新从temp.mat文件中提出变量,load也可读ASCII数据文件.详细语法见联机帮助.第二节向量与矩阵运算Matlab能处理数、向量和矩阵.但一个数事实上是一个1×1的矩阵,1个n维向量也不过是一个1×n或n×1的矩阵.从这个角度上来讲,Matlab处理的所有的数据都是矩阵.Matlab的矩阵处理能力是非常灵活、强大的.以下我们将从矩阵的产生、基本运算、矩阵函数等几个方面来说明.§2.1向量及矩阵的生成除了我们在上节介绍的直接列出矩阵元素的输入方法,矩阵还可以通过几种不同的方式输入到Matlab中.§2.1.1 通过语句和函数产生1. 向量的产生除了直接列出向量元素(即所谓的“穷举法”)外,最常用的用来产生相同增量的向量的方法是利用“:”算符(即所谓的“描述法”).在Matlab中,它是一个很重要的字符.如:z=1:5z =1 2 3 4 5即产生一个1~5的单位增量是1的行向量,此为默认情况.用“:”号也可以产生单位增量不等于1的行向量,语法是把增量放在起始量和结尾量的中间.如:x=0:pi/4:pi即产生一个由0~pi的行向量,单位增量是pi/4=3.1416/4=0.7854.x =0 0.7854 1.5708 2.3562 3.1416也可以产生单位增量为负数的行向量.如:y=6:-1:1y =6 5 4 3 2 12. 矩阵的产生ones(3)ans =1 1 11 1 11 1 1eye(3)ans =1 0 00 1 00 0 1除了以上产生标准矩阵的函数外,Matlab还提供了产生随机(向量)矩阵的函数rand 和randn,及产生均匀级数的函数linspace、产生对数级数的函数logspace和产生网格的函数meshgrid等等.详细使用请查阅随机文档.“: ”冒号可以用来产生简易的表格,为了产生纵向表格形式,首先用冒号“: ”产生行向量,再进行转置,计算函数值的列,然后形成有二列的矩阵.例如命令:x=(0.0:0.2:3.0)';y=exp(-x).*sin(x);[x y]产生结果为:ans =0 00.2000 0.16270.4000 0.26100.6000 0.30990.8000 0.32231.0000 0.30961.2000 0.28071.4000 0.24301.6000 0.20181.8000 0.16102.0000 0.12312.2000 0.08962.4000 0.06132.6000 0.03832.8000 0.02043.0000 0.0070§2.1.2 通过后缀为.m的命令文件产生如有文件data.m,其中包括正文:A=[ 1 2 34 5 67 8 0]则用data命令执行data.m,可以产生名为A的矩阵.§2.2 矩阵操作在Matlab中可以对矩阵进行任意操作,包括改变它的形式,取出子矩阵,扩充矩阵,旋转矩阵等.其中最重要的操作符为“:”,它的作用是取出选定的行与列.例如:A(:,:) 代表A的所有元素;试比较A(:), 将A按列的方向拉成长长的1列(向量);A(:,J) 代表A的第J列;A(J:K) 代表A(J), A(J+1), …, A(K),如同A(:)的第J到第K个元素;A(:,J:K) 代表A(:,J), A(:,J+1), …, A(:,K),如此类推.对矩阵可以进行各种各样的旋转、变形、扩充:Matlab中有内部函数fliplr ( Flip matrix in the left/right direction),它对矩阵进行左右旋转.例x = 1 2 3 fliplr(x)为 3 2 14 5 6 6 5 4同样有flipud:x = 1 4 flipud(x)为 3 62 5 2 53 6 1 4矩阵的转置用符号“' ”表示:如A=[1 2 3; 4 5 6 ; 7 8 0]那么:计算B=A'B =1 4 72 5 83 6 0符号“' ”为矩阵的转置,如果Z为复矩阵,则Z'为它的复数共轭转置,非共轭转置使用Z.' 或conj(Z')求得.reshape改变矩阵的形状,这是什么意思呢?可举一个例子来说明.A=[A;[10 11 12]]A =1 2 34 5 67 8 010 11 12则reshape(A,2,6)ans =1 72 83 04 105 116 12可见,reshape 是将矩阵元素以列为单位进行重组,原来4×3的矩阵变为了2×6的矩阵.那么以下的语句也不难理解了,它将矩阵A按列打开(size函数返回矩阵A的行数与列数).reshape(A,1,size(A,1)*size(A,2)),它等价于A(:)' .还有函数rot90,它可以将矩阵进行各种90度的旋转;tril及triu取出矩阵的下三角及上三角阵等.详细的用法可以在需要使用时查阅手册.第三节矩阵的基本运算§3.1 加和减如矩阵A和B的维数相同,则A+B与A-B表示矩阵A与B的和与差.如果矩阵A和B的维数不匹配,Matlab会给出相应的错误提示信息.如:A= B=1 2 3 1 4 74 5 6 2 5 87 8 0 3 6 0C =A+B返回:C =2 6 106 10 1410 14 0如果运算对象是个标量(即1×1矩阵),可和其它矩阵进行加减运算.例如:x= -1 y=x-1= -20 -12 1§3.2矩阵乘法Matlab中的矩阵乘法有通常意义上的矩阵乘法,也有Kronecker乘法,以下分别介绍.§3.2.1 矩阵的普通乘法矩阵乘法用“* ”符号表示,当A矩阵列数与B矩阵的行数相等时,二者可以进行乘法运算,否则是错误的.计算方法和线性代数中所介绍的完全相同.如:A=[1 2 ; 3 4]; B=[5 6 ; 7 8]; C=A*B,结果为C=1234×5678=1527162835473648=19224350即Matlab返回:C =19 2243 50如果A或B是标量,则A*B返回标量A(或B)乘上矩阵B(或A)的每一个元素所得的矩阵.§3.2.2 矩阵的Kronecker乘法对n×m阶矩阵A和p×q阶矩阵B,A和B的Kronecher乘法运算可定义为:111212122212.........m m n n nm a Ba B a B a B a Ba B C A B a B a B aB由上面的式子可以看出,Kronecker 乘积A ⊗B 表示矩阵A 的所有元素与B 之间的乘积组合而成的较大的矩阵,B ⊗A 则完全类似.A ⊗B 和B ⊗A 均为np ×mq 矩阵,但一般情况下A ⊗B ≠B ⊗A .和普通矩阵的乘法不同,Kronecker 乘法并不要求两个被乘矩阵满足任何维数匹配方面的要求.Kronecker 乘法的Matlab 命令为C=kron(A,B),例如给定两个矩阵A 和B :A =1234 B=132246则由以下命令可以求出A 和B 的Kronecker 乘积C :A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; C=kron(A,B)C =1 32 2 6 42 4 6 4 8 123 9 64 12 86 12 18 8 16 24作为比较,可以计算B 和A 的Kronecker 乘积D ,可以看出C 、D 是不同的:A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; D=kron(B,A)D =1 2 3 6 2 43 4 9 12 6 82 4 4 8 6 126 8 12 16 18 24§3.3 矩阵除法在Matlab 中有两种矩阵除法符号:“\”即左除和“/”即右除.如果A 矩阵是非奇异方阵,则A\B 是A 的逆矩阵乘B ,即inv(A)*B ;而B/A 是B 乘A 的逆矩阵,即B*inv(A).具体计算时可不用逆矩阵而直接计算.通常:x=A\B 就是A*x=B 的解;x=B/A 就是x*A=B 的解.当B 与A 矩阵行数相等可进行左除.如果A 是方阵,用高斯消元法分解因数.解方程:A*x(:, j)=B(:, j),式中的(:, j)表示B 矩阵的第j 列,返回的结果x 具有与B 矩阵相同的阶数,如果A 是奇异矩阵将给出警告信息.如果A 矩阵不是方阵,可由以列为基准的Householder 正交分解法分解,这种分解法可以解决在最小二乘法中的欠定方程或超定方程,结果是m ×n 的x 矩阵.m 是A 矩阵的列数,n 是B 矩阵的列数.每个矩阵的列向量最多有k 个非零元素,k 是A 的有效秩. 右除B/A 可由B/A=(A'\B')'左除来实现.§3.4矩阵乘方A^P 意思是A 的P 次方.如果A 是一个方阵,P 是一个大于1的整数,则A^P 表示A 的P 次幂,即A 自乘P 次.如果P 不是整数,计算涉及到特征值和特征向量的问题,如已经求得:[V,D]=eig(A),则:A^P=V*D.^P/V (注:这里的.^表示数组乘方,或点乘方,参见后面的有关介绍)如果B 是方阵, a 是标量,a^B 就是一个按特征值与特征向量的升幂排列的B 次方程阵. 如果a 和B 都是矩阵,则a^B 是错误的.§3.5 矩阵的超越函数在Matlab中解释exp(A)和sqrt(A)时曾涉及到级数运算,此运算定义在A的单个元素上.Matlab可以计算矩阵的超越函数,如矩阵指数、矩阵对数等.一个超越函数可以作为矩阵函数来解释,例如将“m”加在函数名的后边而成expm(A)和sqrtm(A),当Matlab运行时,有下列三种函数定义:expm 矩阵指数logm 矩阵对数sqrtm 矩阵开方所列各项可以加在多种m文件中或使用funm.请见应用库中sqrtm.m,1ogm.m,funm.m 文件和命令手册.§3.6数组运算数组运算由线性代数的矩阵运算符“*”、“/”、“\”、“^”前加一点来表示,即为“.*”、“./”、“.\”、“.^”.注意没有“.+”、“.-”运算.§3.6.1数组的加和减对于数组的加和减运算与矩阵运算相同,所以“+”、“-”既可被矩阵接受又可被数组接受.§3.6.2数组的乘和除数组的乘用符号.*表示,如果A与B矩阵具有相同阶数,则A.*B表示A和B单个元素之间的对应相乘.例如x=[1 2 3]; y=[ 4 5 6];计算z=x.*y结果z=4 10 18数组的左除(.\)与数组的右除(./),由读者自行举例加以体会.§3.6.3 数组乘方数组乘方用符号.^表示.例如:键入:x=[ 1 2 3]y=[ 4 5 6]则z=x.^y=[1^4 2^5 3^6]=[1 32 729](1) 如指数是个标量,例如x.^2,x同上,则:z=x.^2=[1^2 2^2 3^2]=[ 1 4 9](2) 如底是标量,例如2 .^[x y] ,x、y同上,则:z=2 .^[x y]=[2^1 2^2 2^3 2^4 2^5 2^6]=[2 4 8 16 32 64] 从此例可以看出Matlab算法的微妙特性,虽然看上去与其它乘方没什么不同,但在2和“.”之间的空格很重要,如果不这样做,解释程序会把“.”看成是2的小数点.Matlab 看到符号“^”时,就会当做矩阵的幂来运算,这种情况就会出错,因为指数矩阵不是方阵.§3.7 矩阵函数Matlab的数学能力大部分是从它的矩阵函数派生出来的,其中一部分装入Matlab本身处理中,它从外部的Matlab建立的M文件库中得到,还有一些由个别的用户为其自己的特殊的用途加进去的.其它功能函数在求助程序或命令手册中都可找到.手册中备有为Matlab 提供数学基础的LINPACK和EISPACK软件包,提供了下面四种情况的分解函数或变换函数:(1)三角分解;(2)正交变换;(3) 特征值变换;(4)奇异值分解.§3.7.1三角分解最基本的分解为“LU”分解,矩阵分解为两个基本三角矩阵形成的方阵,三角矩阵有上三角矩阵和下三角矩阵.计算算法用高斯变量消去法.从lu函数中可以得到分解出的上三角与下三角矩阵,函数inv得到矩阵的逆矩阵,det 得到矩阵的行列式.解线性方程组的结果由方阵的“\”和“/”矩阵除法来得到.例如:A=[ 1 2 34 5 67 8 0]LU分解,用Matlab的多重赋值语句[L,U]=lu(A)得出注:L结果只需计算L*U即可.求逆由下式给出:x=inv(A)x =从LU的值可由下式给出:d=det(A)d =27直接由三角分解计算行列式:d=det(L)*det(U)d =27.0000为什么两种d的显示格式不一样呢? 当Matlab做det(A)运算时,所有A的元素都是整数,所以结果为整数.但是用LU分解计算d时,L、U的元素是实数,所以Matlab产生的d也是实数.例如:线性联立方程取b=[ 135]解Ax=b方程,用Matlab矩阵除得到x=A\b结果x=0.33330.33330.0000由于A=L*U,所以x也可以有以下两个式子计算:y=L\b,x=U\y.得到相同的x值,中间值y为:y =5.00000.28570.0000Matlab中与此相关的函数还有rcond、chol和rref.其基本算法与LU分解密切相关.chol函数对正定矩阵进行Cholesky分解,产生一个上三角矩阵,以使R'*R=X.rref用具有部分主元的高斯-约当消去法产生矩阵A的化简梯形形式.虽然计算量很少,但它是很有趣的理论线性代数.为了教学的要求,也包括在Matlab中.§3.7.2正交变换“QR”分解用于矩阵的正交-三角分解.它将矩阵分解为实正交矩阵或复酉矩阵与上三角矩阵的积,对方阵和长方阵都很有用.例如A=[ 1 2 34 5 67 8 910 11 12]是一个降秩矩阵,中间列是其它二列的平均,我们对它进行QR分解:[Q,R]=qr(A)R的下三角都给出0,并且R(3,3)=0.0000,说明矩阵R与原来矩阵A都不是满秩的.下面尝试利用QR分解来求超定和降秩的线性方程组的解.例如:b=[ 1357]讨论线性方程组Ax=b,我们可以知道方程组是超定的,采用最小二乘法的最好结果是计算x=A\b.结果为:Warning: Rank deficient, rank = 2 tol = 1.4594e-014x =0.50000.1667我们得到了缺秩的警告.用QR分解法计算此方程组分二个步骤:y=Q'*bx=R\y求出的y值为xWarning: Rank deficient, rank = 2 tol = 1.4594e-014x =0.50000.1667用A*x来验证计算结果,我们会发现在允许的误差范围内结果等于b.这告诉我们虽然联立方程Ax=b是超定和降秩的,但两种求解方法的结果是一致的.显然x向量的解有无穷多个,而“QR”分解仅仅找出了其中之一.§3.7.3奇异值分解在Matlab中三重赋值语句[U,S,V]=svd(A)在奇异值分解中产生三个因数:A=U*S*V 'U矩阵和V矩阵是正交矩阵,S矩阵是对角矩阵,svd(A)函数恰好返回S的对角元素,而且就是A的奇异值(其定义为:矩阵A'*A的特征值的算术平方根).注意到A矩阵可以不是方的矩阵.奇异值分解可被其它几种函数使用,包括广义逆矩阵pinv(A)、秩rank(A)、欧几里德矩阵范数norm(A,2)和条件数cond(A).§3.7.4 特征值分解如果A是n×n矩阵,若λ满足Ax=λx,则称λ为A的特征值,x为相应的特征向量.函数eig(A)返回特征值列向量,如果A是实对称的,特征值为实数.特征值也可能为复数,例如:A=[ 0 1-1 0]eig(A)产生结果ans =0 + 1.0000i0 - 1.0000i如果还要求求出特征向量,则可以用eig(A)函数的第二个返回值得到:[x,D]=eig(A)D的对角元素是特征值.x的列是相应的特征向量,以使A*x=x*D.计算特征值的中间结果有两种形式:Hessenberg形式为hess(A),Schur形式为schur(A).schur形式用来计算矩阵的超越函数,诸如sqrtm(A)和logm(A).如果A和B是方阵,函数eig(A,B)返回一个包含一般特征值的向量来解方程Ax=λBx双赋值获得特征向量[X,D]=eig(A,B)产生特征值为对角矩阵D.满秩矩阵X的列相应于特征向量,使A*X=B*X*D,中间结果由qz(A,B)提供.§3.7.5秩Matlab计算矩阵A的秩的函数为rank(A),与秩的计算相关的函数还有:rref(A)、orth(A)、null(A)和广义逆矩阵pinv(A)等.利用rref(A),A的秩为非0行的个数.rref方法是几个定秩算法中最快的一个,但结果上并不可靠和完善.pinv(A)是基于奇异值的算法.该算法消耗时间多,但比较可靠.其它函数的详细用法可利用Help求助.第四节Matlab中的图形§4.1二维作图绘图命令plot绘制x-y坐标图;loglog命令绘制对数坐标图;semilogx和semilogy命令绘制半对数坐标图;polor命令绘制极坐标图.§4.1.1 基本形式如果y是一个向量,那么plot(y)绘制一个y中元素的线性图.假设我们希望画出y=[0., 0.48, 0.84, 1., 0.91, 6.14 ]则用命令:plot(y)它相当于命令:plot(x, y),其中x=[1,2,…,n]或x=[1;2;…;n],即向量y的下标编号, n为向量y的长度Matlab会产生一个图形窗口,显示如下图形,请注意:坐标x和y 是由计算机自动绘出的.上面的图形没有加上x轴和y轴的标注,也没有标题.用xlabel,ylabel,title命令可以加上.如果x,y是同样长度的向量,plot(x,y)命令可画出相应的x元素与y元素的x-y坐标图.例:x=0:0.05:4*pi; y=sin(x); plot(x,y)grid on, title(' y=sin( x ) 曲线图' )xlabel(' x = 0 : 0.05 : 4Pi ')结果见下图.§4.1.2 多重线在一个单线图上,绘制多重线有三种办法.第一种方法是利用plot的多变量方式绘制:plot(x1,y1,x2,y2,...,xn,yn)x1,y1,x2,y2,...,xn,yn是成对的向量,每一对x, y在图上产生如上方式的单线.多变量方式绘图是允许不同长度的向量显示在同一图形上.第二种方法也是利用plot绘制,但加上hold on/off命令的配合:plot(x1,y1)hold onplot(x2,y2)hold off第三种方法还是利用plot绘制,但代入矩阵:如果plot用于两个变量plot(x,y),并且x,y是矩阵,则有以下情况:(1)如果y是矩阵,x是向量,plot(x,y)用不同的画线形式绘出y的行或列及相应的x 向量,y的行或列的方向与x向量元素的值选择是相同的.(2)如果x是矩阵,y是向量,则除了x向量的线族及相应的y向量外,以上的规则也适用.(3)如果x,y是同样大小的矩阵,plot(x,y)绘制x的列及y相应的列.还有其它一些情况,请参见Matlab的帮助系统.§4.1.3 线型和颜色的控制如果不指定划线方式和颜色,Matlab会自动为您选择点的表示方式及颜色.您也可以用不同的符号指定不同的曲线绘制方式.例如:plot(x,y,'*') 用'*'作为点绘制的图形.plot(x1,y1,':',x2,y2,'+') 用':'画第一条线,用'+'画第二条线.如果你的计算机系统不支持彩色显示,Matlab将把颜色符号解释为线型符号,用不同的线型表示不同的颜色.颜色与线型也可以一起给出,即同时指定曲线的颜色和线型.例如:t=-3.14:0.2:3.14;x=sin(t); y=cos(t);plot(t,x, '+r',t,y, '-b')§4.1.4对数图、极坐标图及条形图loglog、semilogx、semilogy和polar的用法和plot相似.这些命令允许数据在不同的graph paper上绘制,例如不同的坐标系统.先介绍的fplot是扩展来的可用于符号作图的函数.*fplot(fname,lims) 绘制fname指定的函数的图形.*polar( theta, rho) 使用相角theta 为极坐标形式绘图,相应半径为rho,其次可使用grid 命令画出极坐标网格.*loglog 用log10-log10标度绘图.*semilogx 用半对数坐标绘图,x轴是log10,y是线性的.*semilogy 用半对数坐标绘图,y轴是log10,x是线性的.*bar(x) 显示x向量元素的条形图,bar不接受多变量.*hist 绘制统计频率直方图.*histfit(data,nbins) 绘制统计直方图与其正态分布拟合曲线.fplot函数的绘制区域为lims=[xmin,xmax],也可以用lims=[xmin,xmax,ymin,ymax]指定y 轴的区域.函数表达式可以是一个函数名,如sin,tan等;也可以是带上参数x的函数表达式,如sin(x),diric(x,10);也可以是一个用方括号括起的函数组,如[sin, cos].例1:fplot('sin',[0 4*pi])例2:fplot('sin(1 ./ x)', [0.01 0.1])例3:fplot('abs(exp(-j*x*(0:9))*ones(10,1))',[0 2*pi],'-o')例4:fplot('[sin(x), cos(x) , tan(x)]',[-2*pi 2*pi -2*pi 2*pi]) %%(图4.1.4.1)下面介绍的是其它几个作图函数的应用.例5:半对数坐标绘图t=0.001:0.002:20;y=5 + log(t) + t;semilogx(t,y, 'b')hold on semilogx(t,t+5, 'r') %% (图4.1.4.2)例6:极坐标绘图t=0:0.01:2*pi;polar(t,sin(6*t)) %% (图4.1.4.3)图4.1.4.3 极坐标绘图 图4.1.4.4正态分布的统计直方图与其正态分布拟合曲线例7:正态分布图我们可以用命令normrnd 生成符合正态分布的随机数. normrnd(u,v,m,n)其中,u 表示生成随机数的期望,v 代表随机数的方差. 运行:a=normrnd(10,2,10000,1); histfit(a) %% (图4.1.4.4)我们可以得到正态分布的统计直方图与其正态分布拟合曲线.例8:比较正态分布(图4.1.4.5(1))与平均分布(图4.1.4.5(2))的分布图:yn=randn(30000,1); %% 正态分布 x=min(yn) : 0.2 : max(yn); subplot(121) hist(yn, x)yu=rand(30000,1); %% 平均分布 subplot(122) hist(yu, 25)-5050500100015002000250000.51200400600800100012001400图4.1.4.5 正态分布与平均分布的分布图§4.1.5 子图在绘图过程中,经常要把几个图形在同一个图形窗口中表现出来,而不是简单地叠加(例。
Matlab 教程第2章 MATLAB矩阵及其运算
H=invhilb(4)
(4) 托普利兹矩阵 托普利兹(Toeplitz)矩阵除第一行第一列外, 其他每个元素都与左上角的元素相同。生 成托普利兹矩阵的函数是toeplitz(x,y),它 生成一个以x为第一列,y为第一行的托普 利兹矩阵。这里x, y均为向量,两者不必等 长。toeplitz(x)用向量x生成一个对称的托普 利兹矩阵。例如
它专门建立一个M文件。下面通过一个简 单例子来说明如何利用M文件创建矩阵。
例2-2 利用M文件建立MYMAT矩阵。 (1) 启动有关编辑程序或MATLAB文本编辑 器,并输入待建矩阵:
(2) 把输入的内容以纯文本方式存盘(设文 件名为mymatrix.m)。 (3) 在MATLAB命令窗口中输入mymatrix, 即运行该M文件,就会自动建立一个名为 MYMAT的矩阵,可供以后使用。
M=100+magic(5)
(2) 范得蒙矩阵 范得蒙(Vandermonde)矩阵最后一列全为1, 倒数第二列为一个指定的向量,其他各列 是其后列与倒数第二列的点乘积。可以用 一个指定向量生成一个范得蒙矩阵。在 MATLAB中,函数vander(V)生成以向量V 为基础向量的范得蒙矩阵。例如, A=vander([1;2;3;5])即可得到上述范得蒙矩 阵。
(2) 利用空矩阵删除矩阵的元素 在MATLAB中,定义[]为空矩阵。给变
量X赋空矩阵的语句为X=[]。注意,X=[]与 clear X不同,clear是将X从工作空间中删
除,而空矩阵则存在于工作空间中,只是 维数为0。
2.2.3 特殊矩阵 1.通用的特殊矩阵 常用的产生通用特殊矩阵的函数有:
zeros:产生全0矩阵(零矩阵)。 ones:产生全1矩阵(幺矩阵)。 eye:产生单位矩阵。 rand:产生0~1间均匀分布的随机矩阵。 randn:产生均值为0,方差为1的标准正态 分布随机矩阵。
matlab矩阵函数
matlab矩阵函数
1.矩阵的形状函数:size:返回矩阵的行数和列数。
2.矩阵的构造函数:zeros:创建含有全零元素的矩阵;ones:创建含有全1元素的矩阵;eye:创建对角线元素为1、其他元素为0的矩阵;rand:创建符合指定类型的随机数矩阵;randn:创建具有正态分布的随机矩阵。
3.矩阵表示:diag:返回矩阵的对角线元素;tril:返回下三角矩阵;triu:返回上三角矩阵;fliplr:矩阵左右翻转;flipud:矩阵上下翻转。
4.矩阵的算术运算:+:矩阵相加;-:矩阵相减;.*:矩阵元素相乘;./:矩阵元素相除;\:求以矩阵的逆;^:求矩阵的n次幂。
5.矩阵的元素访问:end:访问矩阵元素的最大索引值;length:返回矩阵中最大维度的大小。
6.矩阵排序函数:sort:矩阵中数据按列或者按行排序;unique:查找矩阵中的唯一元素,并将其列出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
矩阵运算表达式动态解释扩展函数库使用帮助与说明文件Version 3.2.3Copyright (C) NEAU Tan KaiShuai Inc.欢迎使用:shellEval数学表达式动态解释计算扩展函数库。
这是本人自学了<数据结构>和<编译原理>后开发的工具,当前最终发行版本:V3.2.3。
最初作为一个实用的文本字符串解释器,可以帮助程序开发人员快速地整合到自己的应用程序之中。
随着版本的不断升级,功能也越发完善,现V3.2.3版本已包含字符串解释、数学计算、线性代数、动态编连等相关操作总计约两百个导出接口函数,主要用于实现高级语言之间的动态解释计算与调用。
例如对MATLAB的不能实现的相关功能做了较大的扩充。
关于V3.2.3以前各个旧版本的相关介绍在网上请自行下载。
shellEvalV3.2.3不是对旧版本如evalexprV1.4.4等的简单扩充,相反地,它在旧版本evalexprV1.4.4的基础上去掉了大部分与数值动态编连解释计算无关的函数,只保留了原先版本的主要核心算法,同时对核心算法的相应函数另外增加了一个在原函数同名函数的基础上加M结尾的版本,例如evalexpr对应的函数是:evalexprM。
这类以M结尾的函数提供了基于MatCom核心的矩阵运算功能。
虽然本函数库是基于MatCom Version 4.5.1开发而成的,但是使用它时并不需要用户安装拥有MatCom,只需要使用本函数库提供的相应接口即可实现。
众所周知,MatLab、MatCom等数学软件提供了大约上千个矩阵数值运算函数,但是对于表达式的动态解释执行却是不能够实现的。
例如:eval(TM(“[1,2;3,4]”));MatCom可以实现,但是其功能也仅限于此。
如下最基本的调用:eval(TM(“sin([1,2;3,4])”));等皆不能实现。
而MatLab虽然可以利用计算引擎技术与DDE动态数据交换技术间接实现字符串表达式的动态解释执行,但是效率低下,更重要的是,它要求用户机器上必须安装有匹配版本的体积庞大的MatLab,实际软件发布时是难以保证的。
本函数库主要用于对MATLAB、MatCom等矩阵运算软件表达式动态解释执行的扩展,利用它可以实现非常复杂的表达式计算,无论在表达式类型种类还是矩阵运算方面都远非网络上的其他一些表达式计算控件可比。
例如计算上式,如下:#include “evalexpr.h”initEval(NULL,NULL,NULL);Matrix *value=allocM(1);int rtn=evalexprM(“sin([1,2;3,4])”,value);if(rtn>=0){dispM(value);}else{printf(“Eval Failed\n”);}freeM(value);value=NULL;exitEval();可以看出利用本函数库完全无需依赖于MatCom或者其他第三方软件,当然你也可以结合它们使用,使得程序开发更加得心应手。
利用本工具你甚至可以只用四条语句即可编制一个迷你版的MatLab软件。
如下:#include “evalexpr.h”int main(int argc, char* argv[]){initEval(NULL,NULL,NULL);atexit((void (*)())(exitEval));shellEvalM();exitEval();return 0;}怎样?够简单吧!但是生成的迷你版MatLab功能可不容小觑。
为了运行之,需要将以下动态链接支持库复制到程序搜索目录下:evalexpr.dll ago4501.dll v4501v.dll。
关于本函数库内核及具体使用方法以下将有介绍。
本函数库仿照Math Tools公司的MatCom与Math Works公司的MatLab制作开发,相信对于数值计算与混合编程的各位程序爱好者与开发人员有所帮助。
一、shellEval概要1、MA TLAB、MA TCOM与MA TFOR简介在当前工程运算中,对大量数据的快速运算处理已经是必不可少的基本要求了。
而实际使用的庞大数据量通常使用数组或者矩阵或者与其相关的数据结构来表示。
因此线性代数的发展为工程计算大量数据的处理奠定了理论基础,而MATLAB等矩阵运算软件的发布则将矩阵数值运算实际普及起来。
当前面向矩阵运算的数学工具软件主要有:MATLAB、Maple、Mathematica、Scilab、MatCom、MA TFOR等。
众所周知,MA TLAB拥有强大的矩阵运算能力,灵活多变的外部应用程序编程接口,作为矩阵数值运算的首选工具具有无可比拟的强大优势,但是其体积过于庞大,作为仿MA TLAB的一个简化软件Scilab因此诞生。
而在符号运算中表现卓越的Maple与Mathematica两个软件则只提供了对矩阵数值运算的弱支持,并且难以实现与外部应用程序的混合编程。
MatCom与MA TFOR则是提供了大量的矩阵运算函数库用于应用程序的二次开发,与MATLAB提供的运算函数库一样,使应用程序脱离其软件母体而独立发布与执行成为了可能。
但是,利用MATLAB、MatCom、MA TFOR提供的矩阵运算函数库开发独立的应用程序有两个致命的问题令人深感遗憾:[1]开发的应用程序独立发布需要附带体积庞大的运行时支持动态库。
MATLAB6.5需要解压mglinstaller.exe,精简压缩大约需要9M左右;MA TLAB7.X需要预安装MCRinstaller.exe,安装程序体积不小于90M,并且极度麻烦;MA TFOR需要打包至少30M左右的运行时支持动态链接库,同时附加用户注册文件;MatCom需要的体积较小,精简压缩只需要3M左右的空间。
[2]无论是MATLAB、MatCom、MA TFOR或者其他数学软件,外部编程都不具有矩阵数学表达式动态解释运算能力。
所谓动态解释执行,是指在最终应用程序运行过程中,由用户自行输入命令表达式组成的字符串序列,然后交由应用程序解释执行。
而在应用程序开发过程中的编译阶段由程序开发人员控制运算操作顺序且由编译程序完成命令表达式计算的过程称为静态解释执行。
显然,我们真正需要的是能够完成动态表达式解释执行的函数库调用。
(注:利用MA TLAB的计算引擎技术与DDE数据交换技术也可以间接实现表达式动态解释执行的目的,但是其执行效率很低,并且需要用户计算机上安装有匹配版本的庞大的MATLAB,因此实际实现起来极不方便,因此无视掉。
) 鉴于以上两个问题的提出,尤其是对表达式动态解释执行函数库的殷切需求,旨在解决上述问题的动态表达式解释运算函数库:shellEval应运而生。
2、shellEval动态解释计算扩展函数库的开发矩阵表达式动态解释计算shellEval函数库(旧版本称:evalexpr.dll)主要提供一系列可供用户直接调用的矩阵动态编译解释执行接口。
如上图所示,shellEval解释执行过程内核主要由以下几部分构成:[1]预翻译程序:实现用户输入表达式的预处理,如:表达式规范化、矩阵生成格式转换、用户自定义变量处理等。
其中主要函数如下:int pretransexpr(const char *str,char *buff);int pretransexprM(const char *str,char *buff);[2]转换程序:实现将用户输入的命令表达式转换成扩展逆波兰表达式字符串,扩展逆波兰表达式形式比较复杂,不作介绍。
其中主要函数如下:int popbuff(char *buff,int *p_n_buff,char *expr,int *p_n_expr);int transexpr(const char *str,char *expr);int transexprM(const char *str,char *expr);[3]执行程序:解释执行转换后的扩展逆波兰表达式,并且返回运算之后的结果。
其中包含的主要函数如下:int calcexpr(const char *expr,double *value);int calcexprM(const char *expr,Matrix *value);下面两个函数允许返回多个表达式的结果:int calcexprmul(const char *expr,double *value,double *vals,int *valn);int calcexprmulM(const char *expr,Matrix *value,Matrix *vals,int *valn);[4]底层工具函数核心:支持预翻译程序、转换程序、执行程序的一系列核心工具程序,主要包含扩展字符串替换、用户自定义变量操作、字符判断处理、运算符及优先级判断等。
由于包含的函数很多,在此不一一详列。
[5]计算核心:执行程序实际运算调用工具函数集合,大致可分为运算符计算核心与函数计算核心两类。
计算核心内部使用MatCom成熟的库函数文件,执行效率很高。
运算符计算核心程序包括:int strop(double *a,char op,double *b);int stropM(Matrix *a,char op,Matrix *b);int callstrop(double *a,const char *op,double *b,double *val);int callstropM(Matrix *a,const char *op,Matrix *b,Matrix *val);函数调用计算核心程序包括:int strfunc(const char *func,double *x);int strfuncM(const char *func,Matrix *x);int callstrfunc(const char *func,double *x,int len,double *val);int callstrfuncM(const char *func,Matrix *x,int len,Matrix *val);(注:以上shellEval内核实现程序使用起来相当复杂,除非有必要,否则不推荐用户直接调用使用,而是使用以下提供的相应用户接口。
)[6]用户调用接口程序:下面着重介绍shellEval内核中直接面向用户的用户调用接口程序。
shellEval用户调用接口程序主要包含以下几类:(1)基本用户调用接口int evalexpr(const char *str,double *value);int evalexprM(const char *str,Matrix *value);其中str即为用户输入的命令表达式字符串,value是需要返回值的指针,如果不需要存储返回的表达式的值,可以置空(NULL)。