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日
    浏览(26)
  • 双目立体匹配中的极线约束(Epipolar Constraint),基础矩阵(Fundamental Matrix),本质矩阵(Essential Matrix),对极几何(2D-2D)

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

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

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

    2024年02月07日
    浏览(35)
  • 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日
    浏览(33)
  • Git 的标准提交规范(Conventional Commits)& Git 分支管理

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

    2024年02月09日
    浏览(40)
  • 【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日
    浏览(17)
  • A First course in FEM —— matlab代码实现求解传热问题(稳态)

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

    2024年02月09日
    浏览(31)
  • 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日
    浏览(35)
  • MySQL中的in+子查询应该如何优化

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

    2024年01月19日
    浏览(33)
  • R中的波浪线Tilde_in_R

    Tilde symbol l is used within formulas of statistical models, as mainly this symbol is used to define the relationship between the dependent variable and the independent variables in the statistical model formula in the R programming language. The left side of the tilde symbol specifies the target variable ( dependent variable or outcome) and the right side

    2024年02月22日
    浏览(17)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包