Matlab矩阵及表示

matlab名为矩阵实验室,可见矩阵在整个软件中的重要地位。然而在入门matlab的时候,总觉得矩阵表示有点复杂。一维数组(向量)、二位数组(矩阵)、多维数组在本质上应该是一致的,但是实际情况并非如此。举个例子:

a = [1; 2; 3]       % a 是一维数组(向量)
b = [a, a, a]       % b 则变成了二维数组
c = [b, b, b]       % c 依然是二维数组
d = [b; b; b]       % d 然然是二维数组

可见,在matlab中,从一维向二维的转变与二维到三维的转变是不同的。本文希望在整理各种情况的基础上总结出一些矩阵表示的理念,并与C++中的多维数组做一下对比。

向量(vector)、矩阵(matrix)、数组(array)

之前是没怎么区分这几个概念的,后来发现原来并没有“多维矩阵”这一说,矩阵只能是二维的,向量只能是一维的,而数组则可以从一维到多维不等。之所以将向量、矩阵从数组体系中抽离出来,是因为向量、矩阵与数组并非同一概念,他们只是在形式上,某些部分碰巧重合了而已。

向量、一维数组

vector,或称矢量,与标量相对,指一个同时具有大小和方向的几何对象,因常常以箭头符号标示以区别于其它量而得名。直观上,矢量通常被标示为一个带箭头的线段,记作\overrightarrow{AB}。在常见的三维空间直角坐标系Oxyz里,基本矢量就是以横轴(Ox)、竖轴(Oy) 以及纵轴(Oz) 为方向的三个单位矢量 \vec{i}、 \vec{j}、 \vec{k}。这三个矢量取好以后,其它的矢量就可以通过三元数组来表示,因为它们可以表示成一定倍数的三个基本矢量的总合。比如说一个标示为(2,1,3)的矢量就是2个矢量 \vec{i} 加上1个矢量 \vec{j} 加上3个矢量 \vec{k} 得到的矢量。(a, b, c) = a\vec{i} + b\vec{j} + c\vec{k}.,于是向量可以表示成[a,b,c](行向量)或者(列向量)的形式,到此便与matlab中的向量对接起来来。不过对于概念上的向量,不同的元素可以属于不同的数据类型;但是在matlab中,向量元素的数据类型必须一致(不然没法表示呀)。

数组是电脑编程语言上,对于“Array”的中文称呼,台湾称陣列。数组中的每一个元素都属于同一个数据类型,不能把不同类型的数据放在同一个数组中。

在matlab中,向量的形式是向量,但很多时候都是被当作数组来使用的。比如申明一个数组a=[1,2,3](或者a=[1 2 3],空格与逗号作用相同),使用a(i)来遍历其中的元素。

字符串数组的表示。其实在matlab中,字符串本身就是数组。令a=‘abcd’,则a(2)=‘b’。如果申请字符串数组,可以使用

arr = ['AAA'; 'BBB'; 'CCC']  % 显示为字符串的向量;三个元素的长度必须相同,否则会报错;字符数组以二维矩阵的形式存储
arr = ['AAA', 'BBB', 'CCC']  % 显示为一个字符串,即 AAABBBCCC;三个元素的长度可以不同,因为 arr 与 'AAABBBCCC' 没有区别

C++中的一维数组。在C++中声明一个一维数组:

int a[10]? //栈变量 int *a=new int[10] //堆变量

与matlab很相似。

矩阵、二维数组

在数学中,矩阵(复数矩阵)是以行列排列的数值、符号或者表达式的方形阵列,矩阵中的items成为元素(elements)或者entries.二维数组又称为矩阵,行列数相等的矩阵称为方阵。与(向量、一维数组之间的关系)不同,(矩阵、二维数组)中的元素类型必须相同(当然在一些弱类型的语言中,数组元素的格式可以不同,javascript?)。在matlab中,定义矩阵可以如下:

a = [11, 12; 21, 22]
a1 = [11, 12]; a2 = [21, 22]; a = [a1; a2]
a1 = [11; 21]; a2 = [12; 22]; a = [a1, a2]
a12 = a(1, 2)  % 获取元素 (1, 2)
a1 = a(:, 2)
% 一般形式为 a(x1, x2, x3, …, xi, …, xn)。xi 代表取数组 a 的第 i 个维度值(索引)为 xi 的元素;如果有 n 个维度的数组只指定到 xi,后续索引默认都是 1。

多维数组

matlab使用的是解释的、弱类型定义语言,变量在使用的时候不需要预先声明。matlab中多维数组的概念使用matrix表示的。可以用如下形式来定义多维数组:

a = [11, 12; 21, 22; 31, 32]  % a 是一维数组(向量)
b = [a, a, a]                  % b 则变成了二维数组
c = [b, b, b]                  % c 依然是二维数组
d = [b; b; b]                  % d 然然是二维数组

?image image image image

在C++中,定义如下:

int a[3][3];  // 栈变量
int (*p)[常量1][常量2];  // p = new int[x][常量1][常量2]; 最高维度是不定的
int **a = new int*[10];
for (int i = 0; i < 10; i++) {
    a[i] = new int[10];
}  // 每个维度的个数都可以动态申请

注意这两种定义方法的区别:第一种最高维度的几个变量在内存中是连续的,第二种则是在多个维度层次上分配内存。

多维数组的使用

假设数组d=ones(2,2,2,2) %四个维度,每个维度有两个值,每个值都=1

image?? image image imageimage image

从整体上看,从原始数组中截取多获得的数组,matlab都是用矩阵来显示的,无论所截出来的子数组有多少个元素,显示的时候,都是用最低的两个维度构建成矩阵显示(如图B);对比图C、D,当高维度的值被限定之后,显示的结果去掉来这一个明确了的高维度;如果高维度没有在选择自数组的时候指定,则默认为1,即d(: ,: ,: ,1)=d(: ,: ,: ,: );看E,最低维度与最高维度都是1,也会你会觉得最终的子数组应该是一个二维矩阵,不,依然是三维矩阵,在原始数组中的最高维度如果能够保留下来,则其不可能降维。另外要提一点的是,矩阵的最低维度是row index,其次是column index,维度依次增加。

在C++中则不同,比如三维数组a[x1][x2][x3],最高维度是x1,其次是x2,最低是x3。在声明变量的时候,可以使用p=new int[x][常量1][常量2]…[常量n],也可以使用int **a=new a[][10],前者是一步申请到所有的空间,低维度的维度值是固定的,后者是分布申请空间,先高维度后低维度。调用的形式都是a[1][2][1]的形式。 当然C++与matlab使用数组的时候还有一点明显的不同,C++的索引值是从0开始的,而matlab则从1开始。

高维数组一般通过拆减成矩阵来计算。

参考内容

评论