004_matrix_conventions_in_Matlab中的矩阵约定

这篇具有很好参考价值的文章主要介绍了004_matrix_conventions_in_Matlab中的矩阵约定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Matlab中的矩阵约定

Matlab这个名字,是Matrix Laboratory的缩写,以前(真的以前,互联网前时代)有一个清华还是北大的几个学生,做的魔性视频里,有个配音:马特拉博,马特拉波,我到现在还能随时想起来,每次想起来大脑里都要响起这个声音。所以我现在使用Matlab,简直是……

Matlab中倒是随处可见Mat,甚至数据文件的后缀名也是.mat,这门所谓的语言,也称为M语言,因为脚本和函数的后缀名是.m

Matlab中,矩阵是其非常核心的概念和数据结构。就像是Python,在numpy之前,也是个弱鸡。Matlab能打,基础就是矩阵和相关的计算工具箱。

1. 矩阵形状

Matlab仲可以表示N维数组,这里用数组,主要是表示一般编程语言中的非稀疏矩阵,类似于C#的MathNet.Numerics库中的DensityMatrix。因为Matlab还有一种稀疏矩阵的表示方式,以后再说。

N为数组,假设每个维度的长度分别为n1, n2, ..., nN,那么这个数组就是一个n1 x n2 x ... x nN的矩阵。数组的元素一共是n1 * n2 * ... * nN个。Matlab专门有个函数size来获取数组的维度信息,还有个函数numel来获取数组元素总长度信息。

前者返回一个行向量,后者返回一个标量。
m ≡ m n 1 × n 2 × ⋯ × n N ∈ R n 1 × n 2 × . . . × n N m \equiv m_{n1\times n2 \times \cdots \times nN} \in \mathbb{R}^{n1 \times n2 \times ... \times nN} mmn1×n2××nNRn1×n2×...×nN

size ( m ) = [ n 1 , n 2 , . . . , n N ] \text{size}(m) = [n1, n2, ..., nN] size(m)=[n1,n2,...,nN]

numel ( m ) = n 1 × n 2 × . . . × n N \text{numel}(m) = n1 \times n2 \times ... \times nN numel(m)=n1×n2×...×nN

此外,还有一个函数ndims,返回数组的维度数目。length函数返回数组的最大维度长度。

ndims ( m ) = N \text{ndims}(m) = N ndims(m)=N

length ( m ) = max ⁡ ( n 1 , n 2 , . . . , n N ) \text{length}(m) = \max(n1, n2, ..., nN) length(m)=max(n1,n2,...,nN)

2. 矩阵元素访问

要访问矩阵的元素,在Matlab中,使用()符号,里面是一个逗号分隔的下标列表。下标列表的长度应该等于数组的维度数目。

约定1:Matlab中的下标从1开始,不是从0开始。

3. 矩阵的全索引

上面我们在讨论向量的约定时,提到了行向量和列向量,这里再次强调一下,Matlab中的矩阵是列优先的。那么列对于矩阵来说什么意思呢?

对于二维数组(包含列向量和行向量),列优先的意思很简单,就是按照列来存储数据。对于如下的 m × n m\times n m×n的矩阵,它在内存中就等同为 m × n m\times n m×n的列向量。

A m × n = a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n A_{m\times n} = \begin{matrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{matrix} Am×n=a11a21am1a12a22am2a1na2namn

A ( : ) = a 11 a 21 ⋮ a m 1 a 12 a 22 ⋮ a m 2 ⋮ a 1 n a 2 n ⋮ a m n A(:) = \begin{matrix} a_{11} \\ a_{21} \\ \vdots \\ a_{m1} \\ a_{12} \\ a_{22} \\ \vdots \\ a_{m2} \\ \vdots \\ a_{1n} \\ a_{2n} \\ \vdots \\ a_{mn} \end{matrix} A(:)=a11a21am1a12a22am2a1na2namn

其实这里说到内存中存储,通常对于很多人来说没有任何意义。但是上面这个事实,对于矩阵的访问也有一定的影响。

实际上,如果我们对于上面那个矩阵:

A = rand(m, n);
A

打印出就是矩阵的形式。

A(:)

打印出就是下面的列向量。

那么对于二维矩阵,这中列优先的方式实际上预期下标(size(A)所获得值),[m, n]是有内在的一致性的。

那个列向量其实也可以写成:

[
    A(1, 1);
    A(2, 1);
    ...
    A(m, 1);
    A(1, 2);
    A(2, 2);
    ...
    A(m, 2);
    ...
    A(1, n);
    A(2, n);
    ...
    A(m, n);
]

使用: 符号,又可以写成

[
    A(:, 1)
    A(:, 2)
    ...
    A(:, n)
]

这个写法,对于二维数组就是列先,对于多维数组,就是排在size返回的维度数组中的后面的维度优先。也就是,先确定最后一个维度,然后确定倒数第二个维度,然后确定倒数第三个维度,以此类推。

约定2:多维矩阵,高维优先。

对于上面的N维数组,A(:, :, ..., :, i_i, i_{i+1}, ..., i_{N})确定了一个n1 x n2 x ... x n_{i-1}的矩阵。也就是,i维到N全部确定,前面的维度都是:,可以在内存中确定一个连续的区域。

如果我们对一个三维数组,采用如下的方式访问:

A(1,1,:)

得到的是n3个不连续的值。如果我们把size函数得到的维度向量中后面的维称为高维,前面的维称为低维。从前到后对应第一维到最后一维。

004_matrix_conventions_in_Matlab中的矩阵约定,马特拉博Matlab,matlab,矩阵,数据结构

那么高维的维度确定后,访问的效率会更高。

约定3:访问矩阵时,当某个维限定,比这个维度高的所有维度都应该被限定,计算会更有效率。

4. 矩阵降维索引

Matalb中的多维数组,还可以采用降维索引的方式访问。

约定4:矩阵降维索引时,没有给定的高维,按高维优先的方式,连接到最后一个维度,这样最后一个维度 i i i 的范围就是 [ 1 , ∏ j = i N n j ] [1, \prod_{j=i}^N n_j] [1,j=iNnj]

这个也很好理解,当我们用一个索引来访问一个二维矩阵 A m × n A_{m\times n} Am×n 时,我们只给定了一个索引,那么这个索引就是列优先的索引,也就是 A ( : ) A(:) A(:) 的索引,它的范围就是 [ 1 , m × n ] [1, m\times n] [1,m×n]

同理,这也可以推到到多维数组上。

5. 矩阵左值和矩阵右值

在Matlab中,语句约定写为:

A = B;

这里的=是赋值操作符,A是左值,B是右值。这个语句的意思是,把右值B的值赋给左值A

当我们按照矩阵的索来引用矩阵作为左值时,右值必须是一个和左值长度相同的数组。或者是一个标量,这个标量会被广播到左值的每一个元素上。当右值和左值长度一样,但是形状不一样,就会按照高维优先的方式,将右值的每个元素对应到左值的每个元素上。

约定5:矩阵作为左值,右值必须是一个和左值长度相同的矩阵,或者是一个标量。

在每个涉及数组(矩阵)的操作中,高维优先可以始终保持访问顺序的一致性。文章来源地址https://www.toymoban.com/news/detail-853923.html

6. 结论

  1. Matlab矩阵索引从1开始(这个第0条是故意的)。
  2. Matlab中的矩阵是列优先的,多维数组是高维优先的。
  3. 访问矩阵时,当某个维限定,比这个维度高的所有维度都应该被限定,计算会更有效率。
  4. 矩阵作为左值,右值必须是一个和左值长度相同的矩阵,或者是一个标量。
  5. 在每个涉及数组(矩阵)的操作中,高维优先可以始终保持访问顺序的一致性。

到了这里,关于004_matrix_conventions_in_Matlab中的矩阵约定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab 自编雅可比矩阵 (jacobi) 函数与官方的Jacobian matrix(雅可比矩阵)函数对比及创新

      最近遇到了一些需要求函数的雅可比矩阵的问题,例如上次发布的 blog:Matlab 最速下降法 实列及代码实现,里面也需要用到求解雅可比矩阵,那篇blog中的雅可比也是自己编写的代码,之前搜过自带的函数 (官方函数叫: jacobian(f,v) 1 ),由于官方的自带的没有自己比较想要

    2024年02月03日
    浏览(37)
  • 双目立体匹配中的极线约束(Epipolar Constraint),基础矩阵(Fundamental Matrix),本质矩阵(Essential Matrix),对极几何(2D-2D)

    考虑一个SLAM中一个常见的问题:如果两个相机在不同位置拍摄同一个物体,或者一个运动的相机在不同时刻拍摄同一物体,我们有理由相信两张图片中各点存在着某种几何关系,这种关系可以用对极几何来描述。对极几何描述了两帧图像中各像素的射影关系(或者说是各匹配

    2024年02月05日
    浏览(41)
  • 使用R语言中的as.matrix函数将数据框(dataframe)转换为矩阵数据

    使用R语言中的as.matrix函数将数据框(dataframe)转换为矩阵数据 在R语言中,数据框(dataframe)是一种常用的数据结构,它由行和列组成,每列可以包含不同类型的数据。然而,有时候我们需要将数据框转换为矩阵数据,以便进行矩阵运算或使用矩阵相关的函数。在这种情况下

    2024年02月07日
    浏览(45)
  • docker安装marcocesarato/php-conventional-changelog报错

    composer require --dev marcocesarato/php-conventional-changelog --no-update “marcocesarato/php-conventional-changelog”: “^1.17” 在小皮环境没问题,在docker+swoole环境下报错

    2024年01月21日
    浏览(44)
  • Git 的标准提交规范(Conventional Commits)& Git 分支管理

    其中,type 表示本次提交的类型,应该从以下几个类型中选择: feat:新功能 fix:修复问题 docs:文档更新 style:代码风格更新 refactor:重构代码 test:增加测试用例 chore:修改项目配置 [optional scope] 表示本次提交的影响范围,可以根据需要添加。 表示本次提交的描述信息,应

    2024年02月09日
    浏览(58)
  • 【Matlab in VSCode】在VSCode中编辑MATLAB文件

    1.1.安装插件 插件:在vscode拓展商店下载 MATLAB Matlab in VSCode 其他: Windows环境(我的系统是win11) MATLAB2019b python3.7.9 1.2.插件配置 MATLAB插件下载后不用配置。 Matlab in VSCode需要进行相应的配置。 Windows用户需要安装用于 Python 的 MATLAB Engine API,详细细节官方提供了说明。https://

    2024年04月27日
    浏览(27)
  • A First course in FEM —— matlab代码实现求解传热问题(稳态)

    这篇文章会将FEM全流程走一遍,包括 网格、矩阵组装、求解、后处理 。内容是大三时的大作业,今天拿出来回顾下。     涡轮机叶片需要冷却以提高涡轮的性能和涡轮叶片的寿命。我们现在考虑一个如上图所示的叶片,叶片处在一个高温环境中,中间通有四个冷却孔。 假设

    2024年02月09日
    浏览(45)
  • MySQL中的in+子查询应该如何优化

    ☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅📅📅面经分享(牛客主页):传送门 🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正! 📜 如果觉得内容还不错,欢迎点赞收藏关注哟!

    2024年01月19日
    浏览(45)
  • Mysql中的not in和null

    当我们在MySQL中使用not in时,例如 如果not in(…)数据中有null时,返回的结果是空表。 错误在于判断 a not in B的方法的本质是a 使用 != 与B中的每一条进行判断 比如 3 not in (null,1,2) ,如果我们以3在不在null,1,2中来理解的话,肯定会认为返回结果是true; 但实践过程是 3 != null 3 !

    2024年02月06日
    浏览(47)
  • JS中的for in和for of

    在JavaScript中, for...in 和 for...of 都是用于迭代循环的结构:   1. for...in 循环: for...in 循环主要用于遍历对象的可枚举属性。这种循环不仅遍历对象自身的属性,还会遍历原型链上的可枚举属性。它的语法如下: 其中 variable 是属性名, object 是要遍历的对象。 注意:虽然 f

    2023年04月20日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包