草庐IT

MATLAB中对方阵行列式的求解、矩阵的累加和与累乘积进行求解、矩阵的排序、矩阵的秩和迹、以及矩阵的特征值和特征向量的求解

每月一号准时摆烂 2025-06-22 原文

目录

1、方阵的行列式计算

2、累加和与累乘积

(1)累加和

(2)累乘积

3、对于数据进行排序

4、求矩阵的秩

5、矩阵的迹

6、计算矩阵的特征值和特征向量

1、方阵的行列式计算

在线性代数中,对于一个方阵进行求值运算需要先将其转换为行列式,MATLAB中提供过了det函数用于对于方阵的行列式进行求值运算,最后计算得到转换后的行列式的值。

例如:

A=[3,4,8;5,1,9;10,12,4];
B=det(A)

计算得到结果为368。

需要注意的是,计算的矩阵必须是一个方阵,否则程序会报错。

2、累加和与累乘积

在数据处理中,经常需要对于所有数据进行累加和以及累乘积进行运算,下面计算在MATLAB对于累加和与累乘积分别进行说明。

(1)累加和

在MATLAB中,第i个元素的累加和指的是从所有数据的第一个开始到第i个元素结束,所有元素的累加之和。假设第i个元素的累加和为,前面的数据为,那么可以推导出公式如下所示:

MATLAB中提供了comsum函数计算从第1个元素到第i个元素的累加和,调用格式如下所示(其中V表示向量,A表示矩阵):

  • cumsum(V):求解向量V的累加和。
  • cumsum(A):如果原矩阵是一个m行n列的矩阵,那么cumsum(A)函数返回一个m行n列的矩阵,矩阵的第i行第j列元素计算的是原矩阵的第j列从第1行元素到第i行元素的累加和。
  • cumsum(A,num):当num=1时,效果与cumsum(A)相同,如果原矩阵是一个m行n列的矩阵,那么cumsum(A,1)函数返回一个m行n列的矩阵,矩阵的第i行第j列元素计算的是原矩阵的第j列从第1行元素到第i行元素的累加和。当num=2时,如果原矩阵是一个m行n列的矩阵,那么cumsum(A,2)函数返回的是一个m行n列的矩阵,矩阵的第i行第j列元素计算的是原矩阵的第i行从第1列元素到第j列元素的累加和。
  • cumsum(A(:)):计算矩阵中第1个元素到该元素位置的所有元素的累加和,计算顺序是从第一列的每一行进行累加,当第一列全部相加之后,第二列再进行相加……最后一个元素即为矩阵中所有元素的累加和。

例如计算一个向量各个元素的累加和:

V=[2,3,4,5,6,4,6];
x=cumsum(V)

运行结果如下所示:

x =
     2     5     9    14    20    24    30

计算一个矩阵中每一列的元素的从第1行的元素到对应行的元素的累加和。

A=[3,4,5,7;4,9,10,13;13,10,11,24];
x=cumsum(A)

运行之后的结果如下所示:

x =
     3     4     5     7
     7    13    15    20
    20    23    26    44

假设原矩阵是一个m行n列的矩阵,计算矩阵每一行从第1列元素开始到第j列元素的累加和以及计算矩阵每一列从第1行到第i行的累加和:

A=[3,4,5,7;4,9,10,13;13,10,11,24];
x=cumsum(A,1)
y=cumsum(A,2)

运行结果如下所示:

x =

     3     4     5     7
     7    13    15    20
    20    23    26    44
y =

     3     7    12    19
     4    13    23    36
    13    23    34    58

计算矩阵中所有元素的累加和:

A=[32,4,16,20;31,24,15,19;10,12,18,22;41,22,20,26];
x=cumsum(A(:))

运算结果如下所示:

x =
    32
    63
    73
   114
   118
   142
   154
   176
   192
   207
   225
   245
   265
   284
   306
   332

通过上面的结果可以看出,该矩阵的累加和为332。

(2)累乘积

在MATLAB中,第i个元素的累乘积指的是从所有数据的第一元素开始到第i个元素结束,所有元素的累乘之积。假设第i个元素的累乘积为,前面的数据为,那么可以推导出公式如下所示:

MATLAB中提供了cumprod函数对于计算从第i个元素到第i个元素的累乘积,调用格式如下所示(其中v表示向量,A表示矩阵):

  • cumprod(V):求解向量V的累乘积。
  • cumprod(A):如果原矩阵是一个m行n列的矩阵,那么cumprod(A)函数返回一个m行n列的矩阵,矩阵的第i行第j列元素计算的是原矩阵的第j列从第1行元素到第i行元素的累乘积。
  • cumprod(A,num):当num=1时,效果与cumprod(A)相同,如果原矩阵是一个m行n列的矩阵,那么cumprod(A,1)函数返回一个m行n列的矩阵,矩阵的第i行第j列元素计算的是原矩阵的第j列从第1行元素到第i行元素的累乘积。当num=2时,如果原矩阵是一个m行n列的矩阵,那么cumprod(A,2)函数返回的是一个m行n列的矩阵,矩阵的第i行第j列元素计算的是原矩阵的第i行从第1列元素到第j列元素的累乘积。
  • cumpord(A(:)):计算矩阵中第1个元素到该元素位置的所有元素的累乘积,计算顺序是从第一列开始,每一行进行累乘,当第一列全部相乘之后,第二列再进行相乘……最后一个元素即为矩阵中所有元素的累乘积。

例如计算一个向量各个元素的累乘积:

V=[2,1,3,4,5,2,3];
x=cumprod(V)

运行结果如下所示:

x =
     2     2     6    24   120   240   720

计算一个矩阵中每一列的元素的从第1行元素到对应元素的累乘积:

A=[3,4,5,6;6,2,1,2;4,3,2,1];
x=cumprod(A)

运行结果如下所示:

x =
     3     4     5     6
    18     8     5    12
    72    24    10    12

假设原矩阵是一个m行n列的矩阵,计算矩阵每一行从第1列元素开始到第j列元素的累乘积以及计算矩阵每一列从第1行元素开始到第i行元素结束的累乘积:

A=[3,4,5,7;4,9,10,13;13,10,11,24];
x=cumprod(A,1)
y=cumprod(A,2)

运行结果如下所示:

x =

           3           4           5           7
          12          36          50          91
         156         360         550        2184
y =

           3          12          60         420
           4          36         360        4680
          13         130        1430       34320

计算矩阵中所有元素的累乘积:

A=[2,3,6;8,5,2;9,11,12];
x=cumprod(A(:))

运行结果如下所示:

x =
           2
          16
         144
         432
        2160
       23760
      142560
      285120
     3421440

在上面的运算结果中,最后一个元素3421440即为矩阵中所有元素的乘积。

3、对于数据进行排序

在进行数据处理的时候,经常需要对于数据进行排序操作,因此编写程序的时候序号对数据进行排序,例如在数据结构就有十大经典排序算法。同样在MATLAB中也提供了sort函数对于数据进行排序操作。

sort函数返回的是一个新的矩阵,默认情况下是从小到大排序的。

  • sort(V):对于向量V进行排序,返回的结果是已经从小到大排序好的向量。
  • sort(A):对于矩阵的每一列的元素进行排序,返回的是每一列的元素从小到大排序好的矩阵。
  • sort(A,num):当num=1的时候,该效果与sort(A)相同,返回的是每一列的元素从小到大排序的好的矩阵;当num=2的时候,对于矩阵的每一行进行排序,返回的结果是每一行的元素从小到大排序好的矩阵。
  • sort(A(:)):返回一个列向量,该向量是矩阵所有元素的从小到大依次排序。

例如,下面利用sort函数对于向量进行排序:

V=[34,23,6,41,65,32,7,53];
V=sort(V)

运算后的结果如下所示:

V =
     6     7    23    32    34    41    53    65

可以看到利用sort函数对于向量进行排序之后向量V变成了各个元素从小到大依次排列好的向量。

再例如,利用sort函数对于矩阵每一列进行排序:

A=[2,5,3;6,10,7;4,9,11;12,4,3];
sort(A)

运行结果如下所示:

ans =
     2     4     3
     4     5     3
     6     9     7
    12    10    11

通过上面的运算结果可以看出,sort函数对于矩阵的每一列的元素进行从小到大的排序。

再例如利用sort函数分别对矩阵的每一行和每一列进行排序:

A=[2,5,3;6,10,7;4,9,11;12,4,3];
x=sort(A,1)
y=sort(A,2)

运行结果如下所示:

x =

     2     4     3
     4     5     3
     6     9     7
    12    10    11
y =

     2     3     5
     6     7    10
     4     9    11
     3     4    12

通过上面的运算结果可以看出,分别当sort(A,num)的num为1或者2时,是分别对于矩阵的列和行进行排序。

利用sort函数对于矩阵的所有元素进行排序:

A=[2,3,6;8,5,2;9,11,12];
sort(A(:))

运行结果如下所示:

ans =
     2
     2
     3
     5
     6
     8
     9
    11
    12

通过运行结果可以看出来,通过sort(A(:))返回的是一个列向量,可以对于矩阵的所有元素进行排序。

4、求矩阵的秩

矩阵的秩是在对于矩阵求线性相关性以及线型方程组的解等问题的一个重要的工具,定义如下:矩阵的秩是线性代数中的一个概念。在线型代数中,一个矩阵A的列秩是线型独立的纵列的极大数,行秩是矩阵的线性无关的横行极大数目。即如果把矩阵看成了一个个行向量或者列向量,秩就是这些行向量和列向量的秩,也就是极大无关组中所含向量的个数。(本段定义来自百度百科矩阵的秩

在我们实际运算的过程中,一般的运算方式是将矩阵转换为行阶梯型矩阵,计算整行中不是全部为0的行的个数,该个数即为矩阵的秩。

而在MATLAB提供了rank函数用于对于矩阵的秩进行计算,例如:

A=[1,2,3;2,4,6;8,4,7];
rA=rank(A)
B=[23,6,5;6,3,11;7,13,12];
rB=rank(B)

运算结果如下所示:

rA =
     2
rB =
     3

通过上面的运算结果显示,A矩阵的秩为2,B矩阵的秩为3,A和B都是三阶矩阵,通过对于矩阵的秩的计算可以得到A是一个满秩矩阵,而B是一个不满秩矩阵。

5、矩阵的迹

对于方阵A来说,方阵对角线上所有对角线之和称为矩阵的迹,即为tr(A),显然矩阵的迹的计算方式为:

 在MATLAB中,提供了trace函数计算矩阵的迹。例如:

A=[4,5,3;7,5,3;9,11,3];
B=trace(A)

运算结果如下所示:

B =
    12

6、计算矩阵的特征值和特征向量

特征值的概念是由法国科学家拉普拉斯在19世纪为研究天体力学、地球力学的时候所引进的概念,在实际应用中矩阵的特征值的应用十分广泛。

假设A是一个n阶的矩阵,如果数和n维非零向量x满足下面的条件:

 那么是方阵A的特征值,非零向量x称为方阵A的对应特征值的特征向量。

上面的公式同样可以写成形式:

上面的式子有非零解的条件是:

同样也可以写成如下形式: 

 在MATLAB中提供了eig函数计算矩阵的特征向量和特征值,调用的格式如下所示:

  • e=eig(A):e是一个列向量,计算矩阵A中的所有的特征值。
  • [V,R]=eig(A):R是矩阵A的特征值构成的对角矩阵,对角阵R上的元素是矩阵A的所有特征值,而V是A各列相应的特征向量。

利用MATLAB的eig函数计算矩阵的特征值,例如:

A=[0,1,1;1,0,1;1,1,0];
B=[4,5,5;3,6,7;8,9,4];
e1=eig(A)
e2=eig(B)

结果如下所示:

e1 =
   -1.0000
   -1.0000
    2.0000

e2 =
   17.0296
    0.6537
   -3.6832

再例如:

A=[12,16,8;9,23,11;24,18,4]
[V,D]=eig(A)

 运行结果如下所示:

V =

   -0.4994   -0.4102   -0.1379
   -0.6110    0.5782   -0.3173
   -0.6143   -0.7053    0.9382
D =

   41.4154         0         0
         0    3.1994         0
         0         0   -5.6149

通过上面的内容可以看出矩阵A的特征值分别为41.4154、3.1994、-5.6149,而矩阵V是矩阵A各列的特征向量。

有关MATLAB中对方阵行列式的求解、矩阵的累加和与累乘积进行求解、矩阵的排序、矩阵的秩和迹、以及矩阵的特征值和特征向量的求解的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

    这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

  9. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  10. ruby - cucumber 特征和步骤定义 - 2

    我是Cucumber测试的新手。我创建了两个特征文件:events.featurepartner.feature并将我的步骤定义放在step_definitions文件夹中:./step_definitions/events.rbpartner.rbCucumber似乎在所有.rb文件中查找步骤信息。有没有办法限制该功能查看特定的步骤定义文件?我之所以要这样做,是因为即使我使用了--guess标志,我也会遇到不明确的匹配错误。我之所以要这样做,有以下几个原因。我正在测试CMS,并希望在不同的功能中测试每种不同的内容类型(事件和合作伙伴)。事件.特征Feature:AddpartnerA

随机推荐