MATLAB与PYTHON交互学习(上)
一,序号
matlab所有数据存储格式的序号均从1开始,而python和大多数编程语言一样从0开始。python中的矩阵为numpy中的array格式。
二,矩阵
1,matlab中矩阵在内存中内存中按列存储,如矩阵:
aa=
1 2 3 4
2 3 4 5
在matlab中a(3)=2,也就是说如果兑换成更加严格的语言的数组的话,a相当于一个二维数组a[4][2],即是一个含有4个元素的数组,每个元素为一个含有两个元素的数组。因此,行矩阵相当于一个二维数组,列矩阵相当于一个一维数组。这一点从matlab函数编译成dll后的C++的接口转换形式中可以得到验证。
如下,代码为一个为列向量的输入,被转换成dll后的接口初始化的部分代码:
static int iv[1] = {4};
/* Set the size of the array.
Change this size to the value that the application requires. */
result = emxCreateND_real_T(1, iv);//一维数组
如下,代码为一个为行向量的输入,被转换成dll后的接口初始化的部分代码:
static int iv[2] = { 1, 4};
int idx1;
/* Set the size of the array.
Change this size to the value that the application requires. */
result = emxCreateND_real_T(2, iv)//二维数组
2,python中的矩阵,在一定程度上在外观表现上和数组更像,如:
aa
array([[1, 2, 3, 4],
[2, 3, 4, 5]])
而且在初始化的时候不像matlab必须使用中括号,python很随便,如下四种形式都能达到建立矩阵的效果:
aa=np.array([[1,2,3,4],[2,3,4,5]])
aa=np.array(((1,2,3,4),[2,3,4,5]))
aa=np.array(([1,2,3,4],[2,3,4,5]))
aa=np.array(([1,2,3,4],(2,3,4,5)))
从目前的经验来看,python是按行存储的,即一行为一个数组。如果将array看做数组的话,上述矩阵为aa[2][4],更像打多数编程语言的写法。与matlab去元素的方式不同,python若想取出一个元素,需要给出详细坐标,如aa[0][1]=2,而且矩阵操作只能使用中括号。python中也可以像matlab中取出某行和某列元素,用法和matlab一致,只不过由小括号变成了中括号。
三,常用函数
1,在matlab中矩阵计算方差,均值,求和等函数名称在python中没有变化:var,mean,sum……。但是用法发生了较大的区别,matlab默认是以列为单位进行计算入var(aa)
结果为[0.5000 0.5000 0.5000 0.5000],若想以行为单位计算需要添加参数。
python中var默认将计算array中的所有元素,因此在python中var(aa)
结果为1.5 ,python 中的var也可以像matlab一样,通过参数来调整是按行计算还是按列计算,var(aa,0)
按列计算,var(aa,1)
按行计算。但是需要注意,python中var中使用的方差函数默认分母为N(元素数),而matlab默认为N-1,因此会有如下结果:
matlab:
var(a)
ans =
0.5000 0.5000 0.5000 0.5000
python:
np.var(aa,axis=0)
In [68]: array([0.25, 0.25, 0.25, 0.25])
matlab可以选择分母为N的,控制分母的变量在matlab的var中的第二个位置,此位置为1则除N,为0则除N-1。如下:
var(a,1,1)
ans =
0.2500 0.2500 0.2500 0.2500
var(a,0,1)
ans =
0.5000 0.5000 0.5000 0.5000
python 也可以通过参数控制来选择分母为N或者N-1,如下:
np.var(aa,axis=0,ddof=1)
array([0.5, 0.5, 0.5, 0.5])
np.var(aa,axis=0,ddof=0)
array([0.25, 0.25, 0.25, 0.25])
其他类似函数雷同