matlab中一些函数在numpy中的对应

最近在看一个算法的matlab代码,想自己用Python实现,中间遇到了一些matlab和numpy的转换问题,特别记录一下,当然,这些都只是我目前遇到的,肯定是不完整版。

matlab和numpy对应表

matlabnumpy说明
size(a)a.shape or np.shape(a)
size(a,n)a.shape[n-1]matlab中矩阵行列从1开始计,numpy中从0开始计
ones(n,m)np.ones((n, m))注意是两层括号
zeros(n,m)np.zeros((n,m))同上
eye(n)eye(n)单位矩阵
a*ba.dot(b) or np.dot(a,b)a,b均为矩阵,a的列数等于b的行数
5*a5*a
a.*ba*b
a’*anp.dot(a.conj().T, a)a为矩阵
a/b
a./ba/b
a\blinalg.solve(a,b) or linalg.lstsq(a,b)a是方阵的时候使用前者,其他情况使用后者
a.’a.transpose() or a.T转置
a’a.conj().transpose() or a.conj().T
a.^2a**2
norm(a)sqrt(dot(a,a)) or np.linalg.norm(a)默认是L2
a&&ba and b
a||ba or b
sort(a)np.sort(a) or a.sort()
sqrt(a)np.sqrt(a)
diag(a)np.diag(np.diag(a))a是一个矩阵
a(end)a[-1]
[v1 v2 v3]np.c_[v1,v2,v3] or np.hstack((v1,v2,v3))连接行
[v1;v2;v3]np.r_[v1,v2,v3] or np.vstack((v1,v2,v3))连接列
max()max()
max(a,b)maximum(a,b)比较两个数组的每个位置,由每个位置的最大值组成新数组返回
abs()abs()
sum()sum()
epsnp.spacing(1)
infnp.inf无穷大
disp() or fprintf()print()输出
a(2,:)a[1] or a[1,:]取矩阵的第二行,这种对矩阵行列的操作,一般只需要把()改成[],然后索引-1

其他一些问题

在matlab中有一个求对角矩阵的函数:diag(a),a为矩阵,得到的结果是以矩阵a为对角线,其余元素为0的一个新的矩阵,和矩阵的大小大小相同。
而numpy的diag(a)的功能完全不一样,具体如下:

import numpy as np
a = np.arange(1, 4)
b = np.arange(1, 10).reshape(3, 3)
print(a)
print(np.diag(a))
print(b)
print(np.diag(b))

[1 2 3]

[[1 0 0]
 [0 2 0]
 [0 0 3]]
 
[[1 2 3]
 [4 5 6]
 [7 8 9]]
 
[1 5 9]

我们可以看出来当np.diag(a)中的a是一维数组的时候,结果会返回一个以一维数组为对角线元素的矩阵,当a是一个二维数组时,结果会返回数组的对角线元素。所以很多人提到可以使用两个diag()函数,即np.diag(np.diag())来完成matlab中的diag(),但我当时并未想到,故使用了以下方法来实现。

n = np.size(a, axis=1)
a = np.diag(a) * np.eye(n)

待解决问题

在改写中还遇到一个比较麻烦的地方。

[p,ntask] = size(beta);
for i = 1:p
    d(i) = 0.5 ./ (sum(beta(i,:).^2)+eps);
end

上面是matlab的代码,下面是使用numpy的python代码

p = np.size(beta, 0)
d = np.empty(shape=(1, 0))
for i in range(p):
    dt = 0.5 / (sum(beta[i, :] ** 2) + np.spacing(1))
    d = np.append(d, [[dt]], axis=1)

这个地方之后再详细写,还有matlab中传参个数可以不固定,然后利用nargin来判断参数个数的问题,以及matlab中可以使用以下的方式定义和调用。

para.lambda.u1 = 0.01;
para.lambda.v1 = 0.01;

[u, v] = train(train_set, para); 

在train中直接使用lambda.u1调用

这样的写法还没有找到类似的写法,等以后再来解决。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值