矩阵下标操作

【MATLAB技术】矩阵下标操作

在MATLAB里面,对于一个二维矩阵,比如A=magic(3),有两种访问矩阵A元素的方法。

1、可以通过A(i,j)来访问A矩阵的第i行,第j列的元素(i,j=1,2,3,4)。我们称(i,j)这种下标为subscript

2、通过通过A(p)来访问A的第p个元素。那什么是A的第p个元素呢?这就要说到MATLAB中矩阵在内存中的存在方式了。

比如矩阵 AA=magic(3)
A = 
   8    1    6 
   3    5    7 
   4    9    2

在内存中的顺序实际上是8,3,4,1,5,9,6,7,2.

所以,A(p)就是上面这列数中的第p个元素,一般称这种(p)的访问方式为index

3、index与subscript的关系

通过一个例子,比如A(3,2)=A(6)=9,这里的(3,2)与6有什么关系呢?通过2,很明显,矩阵在内存中是按列存放的,A(3,2)表示的是第2列的第3个元素。那么index=第2列之前所有的元素+行的位置。即6=(2-1)*3+3。这里的第一个3表示A矩阵的行数,第二个3表示A(3,2)这个元素所在的行。

推而广之,对于A=rand(m,n)这种矩阵。A(i,j)对于的A(index),index=(j-1)*m+i.

4、MATLAB提供的index与subscript相互转化的函数

(1)sub2ind;

(2)ind2sub;

这两个函数的功能同3,用法更加简单,功能也更强大。

5、说了这么多,既然可以通过subscript访问矩阵,为什么还要提index呢?

请看下面问题。

Qusestion:对于矩阵A,还是A=magic(3)

A = 
   8    1    6 
   3    5    7 
   4    9    2

现在,我们想让A(1,1)和A(2,3),A(3,3)这三个元素的值变为0。改如何操作?

(1)可能有人想到下面的办法A([1,2,3],[1,3,3])=0;操作后发现

A = 
   0    1    0 
   0    5    0 
   0    9    0

实际上这句命令的意思是让A的第1,2,3行的1,3列元素置为0。这与我们想要的操作是不一致的。

(2)方法二:一个一个的设置。当然,这是可以的,但不够简便。那有没有直接的方法?

(3)如果我们先把(1,3),(2,3),(3,3)这三个subscript转变为index,再让A(index)=0不就可以了吗?

看下面命令的执行效果 A(sub2ind(size(A),[1 2 3],[2,3,3]))=0

A = 
   8    0    6 
   3    5    0 
   4    9    0

6、本次说明了矩阵元素的两种下标访问方法,重点在于灵活应用,希望对大家编程序有用。

7、更为详细的说明大家可以看帮助文件。(MATLAB2012A的位置如下)

原文地址:https://www.cnblogs.com/wacc/p/3734150.html