0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MATLAB中的矩阵索引

MATLAB 来源:MATLAB 2024-09-05 09:28 次阅读

作者:Steve Eddins 和 Loren Shure,MathWorks

对矩阵进行索引是从矩阵中选择或修改部分元素的一种方式。MATLAB 有几种索引样式,它们不仅功能强大、灵活,而且可读性强、表现力强。矩阵是 MATLAB 用来组织和分析数据的一个核心组件,索引是以可理解的方式有效操作矩阵的关键。

对于 MATLAB 用户来说,索引往往与另一个术语密切相关:向量化。向量化意味着使用 MATLAB 矩阵和向量运算而不是标量运算,这通常会生成更短的代码,更具数学表现力和可读性,有时执行速度还会更快。

对向量进行索引

我们从向量和下标的简单情况开始。

 v = [16 5 9 4 2 11 7 14];
下标可以是单个值:
 v(3)     % 提取第三个元素
  ans =
      9
下标本身也可以是另一个向量。
 v([1 5 6])      % 提取第一个、第五个和第六个元素
  ans =
      16   2   11
MATLAB 中的冒号表示法提供一种从 v 中提取一系列元素的简单方法。
 v(3:7)     % 提取第三个至第七个元素
  ans =
      9   4   2   11   7
交换 v 的两个“半部分”以创建新向量。
v2 = v([5:8 1:4])     % 提取并交换 v 的两个“半部分”
  v2 =
     2   11   7   14   16   5   9   4
特殊的 end 运算符是引用 v 的最后一个元素的简便快捷方法。
  v(end)     % 提取最后一个元素
  ans =
      14
end 运算符可用于表示一个范围。
  v(5:end)     % 提取第五个到最后一个元素
  ans =
      2   11   7   14
您甚至可以使用 end 进行算术运算。
  v(2:end-1)     % 提取第二个到倒数第二个元素
  ans =
      5   9   4   2   11   7
将冒号运算符和 end 结合使用可以实现多种效果,例如提取每第 k 个元素或翻转整个向量。
  v(1end)   % 提取所有奇数元素
  ans =
      16   9   2   7
  v(end1)   % 反转元素的顺序
  ans =
      14   7   11   2   4   9   5   16
通过使用等号左侧的索引表达式,您可以替换向量的某些元素。
  v([2 3 4]) = [10 15 20]   % 替换 v 的某些元素
  v =
    16   10   15   20   2   11   7   14
通常,右侧的元素数必须与左侧的索引表达式所引用的元素数相同。然而,您始终可以在右侧使用标量。这称为标量扩展。
  v([2 3]) = 30   % 用 30 替换第二个和第三个元素
  v =
    16   30   30   20   2   11   7   14

请牢记:MATLAB 使用从 1 开始的索引。在对矩阵进行索引时,有些语言使用从 0 开始的索引。其他语言,如 MATLAB,使用从 1 开始的索引。MATLAB 使用的表示法可能与您在数学教科书中看到的相同。MATLAB 为什么使用从 1 开始的索引?MATLAB 创始人 Cleve Moler 对此解释道,“这就是数学的表示方式。”

使用两个下标对矩阵进行索引 现在考虑对矩阵进行索引。我们将在示例中使用幻方。

  A = magic(4)
  A =
          16           2           3          13
           5          11          10           8
           9           7           6          12
           4          14          15           1
通常,对矩阵进行索引需要使用两个下标 - 第一个下标表示行,第二个下标表示列。wKgZombZCSiAMAbKAAEZNGANc-c781.jpg

最简单的形式是选择一个元素。
  A(2,4)   % 提取第 2 行第 4 列中的元素
  ans =
       8
更常见的是,其中的一个或两个下标可以是向量。
  A(2:4,1:2)
  ans =
           5          11
           9           7
           4          14
下标位置中的单个“:”是 1:end 的简写表示法,通常用于选择整行或整列。
  A(3,:)   % 提取第三行
  ans =
     9   7   6   12
  A(:,end)   % 提取最后一列
  ans =
         13
          8
         12
          1

wKgZombZCSiAG8bxAACCuBLkzgE079.jpg

有时人们对如何从矩阵中选择分散的元素感到困惑。例如,假设您要从 A 中提取元素 (2,1)、(3,2) 和 (4,4)。

wKgZombZCSiAAh4AAACE5Uwqez0301.jpg

矩阵中的分散元素。

我们如何表示这种输出?

表达式 A([2 3 4], [1 2 4]) 不会实现想要的效果。下图说明双下标索引的工作原理

wKgaombZCSiAReuOAACu7V4O72o330.jpg

从矩阵中提取分散的元素需要不同索引样式,下一个主题将讲述这方面内容。

线性索引

表达式 A(14) 的作用是什么?

当仅使用单下标对矩阵 A 进行索引时,MATLAB 会将 A 视为其元素排列在一个长长的列向量中(对 A 中的列逐列从上到下进行索引),如下所示:

16

5

9

...

8

12

1

提示:MATLAB 采用列优先 - 线性索引逐列从上到下开始进行索引。

表达式 A(14) 只提取隐式列向量的第 14 个元素。以这种方式对只使用单下标的矩阵进行索引通常称为线性索引。 右图中每个矩阵元素的左上角均显示线性索引。从图中可以看出,A(14) 等同于 A(2,4)。

wKgaombZCSiAGLiXAACeplTHRwI481.jpg

单下标可以是包含多个线性索引的向量,如在以下示例中:

  A([6 12 15])
  ans =
      11   15   12
再次考虑只提取 A 的元素 (2,1)、(3,2) 和 (4,4)。您可以使用线性索引来提取这些元素。
  A([2 7 16])
  ans =
      5   7   1
此示例很容易理解,但一般情况下如何计算线性索引?MATLAB 提供了名为 sub2ind 的函数,用于将行下标和列下标转换为线性索引。您可以通过以下方式使用它来提取所需的元素:
  idx = sub2ind(size(A), [2 3 4], [1 2 4])
  ans =
      2   7   16
  A(idx)
  ans =
      5   7   1

逻辑索引

另一种索引变体是逻辑索引,它是一种紧凑而富有表现力的表示法,适用于包括图像处理在内的许多应用。在逻辑索引中,使用单个逻辑数组来表示矩阵下标。

您可以使用以下逻辑数组示例:

 A > 12 
wKgZombZCSiAR1pFAAAEhVNA794840.jpg

这些是矩阵中逻辑表达式为真的位置,在本例中是任何大于 12 的位置。 表达式 A(A > 12) 提取对应于逻辑数组的非零值的矩阵元素。输出始终以列向量形式出现。
A(A > 12) 


ans =


    16
    14
    15
    13
许多以 is 开头的 MATLAB 函数返回逻辑数组,对于逻辑索引非常有用。例如,通过在一行代码中结合使用 isnan、逻辑索引和标量扩展,可以将数组中的所有 NaN 元素替换为另一个值。
 B(isnan(B)) = 0
MATLAB 有许多返回逻辑数组的字符串数组函数,例如 contains、startsWith 和 matches。您可以使用这些函数对使用逻辑索引的文本进行操作。例如,您可以提取包含“Skylab”的所有太空计划名称
>> names
wKgZombZCSiAMRDwAAAHL8lR-Xg008.jpg  
>> names(contains(names,"Skylab"))
wKgaombZCSiACkQ2AAAERbYgboY951.jpg

逻辑索引与 find 函数密切相关。表达式 A(A > 5) 等效于 A(find(A > 5))。逻辑索引表达式在简单情况下执行速度更快,但如果您需要计算中的其他项的索引值,则可以使用 find 函数。例如,假设您要用零临时替换 NaN 值,执行一些计算,然后将 NaN 值放回其原始位置。在此示例中,计算是使用 filter2 进行二维过滤。您需要使用以下表达式:
  nan_locations = find(isnan(A)); 


  A(nan_locations) = 0; 


  A = filter2(ones(3,3), A); 


  A(nan_locations) = NaN;
我们希望本文中的这些示例能帮助您了解如何简洁高效地表达算法。在您的 MATLAB 编程中使用这些方法和相关函数使您能够创建简洁、可读和向量化的代码。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    179

    文章

    2946

    浏览量

    229439
  • 矩阵
    +关注

    关注

    0

    文章

    417

    浏览量

    34413
  • 代码
    +关注

    关注

    30

    文章

    4665

    浏览量

    67747

原文标题:MATLAB 中的矩阵索引

文章出处:【微信号:MATLAB,微信公众号:MATLAB】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MATLAB(2)--MATLAB矩阵的表示

    矩阵的建立 利用直接输入法建立矩阵:将矩阵的元素用括号括起来,按矩阵的顺序输入各元素,同一行的各元素之间用逗号或者空格分隔,不同的元素之间
    发表于 09-06 10:05

    MATLAB(3)--矩阵的引用(sub2ind、ind2sub、reshape函数使用)

    的序号为3。 即我们输入的坐标(1,4),(2,5),(3,1)在矩阵A索引号,意思是A矩阵第1行第4个元素的索引值号为16,为什么是1
    发表于 09-06 10:11

    MATLAB(6)--特殊矩阵

    矩阵 对于向量v=[v1 , v2 ,...,v n ],范德蒙矩阵一般形式为: 在Matlab,函数vander(V)生成以向量V为基础的范德蒙
    发表于 09-06 10:24

    matlab 矩阵运算

    matlab 矩阵运算矩阵运算MATLAB矩阵的运算包括算术运算,关系运算和逻辑运算。算术矩阵
    发表于 09-22 15:32

    matlab矩阵特例

    方阵。MATLAB表达式形式:C=A^n2.2.2.5 点运算 MATLAB"."点运算指同阶矩阵每个对应元素进行的算术运算,标量常数可
    发表于 09-22 15:34

    MATLAB线矩阵操作和矩阵分析命令

    MATLAB线矩阵操作和矩阵分析命令矩阵操作 Diag 建立和提取对角阵 Fliplr 矩阵作左右翻转 Flipud
    发表于 09-22 16:02

    [教程] Matlab矩阵、向量及数组元素的引用方法和讨论

    对初学者的有些启示作用。先说说数组、矩阵、方正、行列式、向量的区别(只是个人理解,不一定准确)至于具体的数学定义,大家可以到百度百科查看下1.数组(array):就是我们最熟悉的array,在Matlab
    发表于 05-07 21:48

    MATLAB矩阵及其数值运算

    MATLAB矩阵及其数值运算 变量和数据操作 变量与赋值1.变量命名在MATLAB6.5,变量名是以字母开头,后接字母、数字或下划线的字符序列,最多63个字符。在
    发表于 05-10 10:16

    matlab矩阵如何索引符合特定条件的元素?

    matlab 如何所以符合特定条件的元素,比如 索引大于1的输出来
    发表于 11-12 10:52

    matlab逻辑函数

    matlab逻辑函数 all :向量是否所有分量均非零 any :是否有元素非零 exist :指定变量或文件是否存在 find :返回矩阵中非零元素的索引
    发表于 06-18 14:46 1432次阅读

    matlab输入矩阵的格式的方法步骤

    Matlab语言的核心是矩阵,其最初的出现和应用也是和矩阵息息相关的,矩阵Matlab的基本
    发表于 11-15 11:35 2.1w次阅读

    MATLAB教程之经典MATLAB矩阵及其运算的详细资料说明

    本文档的主要内容详细介绍的是MATLAB教程之经典MATLAB矩阵及其运算的详细资料说明包括了:1 变量和数据操作,2 MATLAB矩阵
    发表于 07-11 16:14 14次下载

    基于MATLAB的有限域校验矩阵程序下载

    基于MATLAB的有限域校验矩阵程序下载
    发表于 05-29 11:33 9次下载

    剖析TransCAD矩阵索引转换和操作

    在上次发布的文章,只给出了矩阵索引的原理,并没有说明相应的操作注意事项。为了使新用户更容易理解创建索引操作,这次重新发布并补充说明矩阵
    的头像 发表于 07-28 15:41 4935次阅读

    MATLAB矩阵和数组操作

    MATLAB矩阵和数组操作非常方便,下面详细介绍一些常用的操作
    的头像 发表于 07-05 09:54 1317次阅读