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之后后面的index就没有来,则默认后面的index都是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]...[常量n];? //
p=new int[x][常量1][常量2]...[常量n];? //这一种方法只有最高维度是不定的
int **a=new a[][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开始。

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

参考内容

Tagged with: , , , , , , , ,

发表评论

邮箱地址不会被公开。 必填项已用*标注

*