稀疏矩阵:Matlab到Python的代码转换
如何将其从Matlab转换为Python:稀疏矩阵:Matlab到Python的代码转换,python,python-2.7,matlab,numpy,sparse-matrix,Python,Python 2.7,Matlab,Numpy,Sparse Matrix,如何将其从Matlab转换为Python: A = sparse(row_idx, col_idx, values, len, s1 * s2); scales = zeros(size(A, 1), 1); scales(sub2ind([s1 s2], floor(frames(2, :)), floor(frames(1, :)))) = ... frames(3, :); eq = A \ scales; 我的尝试是: from scipy.sparse import csr
A = sparse(row_idx, col_idx, values, len, s1 * s2);
scales = zeros(size(A, 1), 1);
scales(sub2ind([s1 s2], floor(frames(2, :)), floor(frames(1, :)))) = ...
frames(3, :);
eq = A \ scales;
我的尝试是:
from scipy.sparse import csr_matrix # to replace sparse matrix
import numpy as np # to replace \ with np.linalg.lstsq
A = csr_matrix((values, (row_idx , col_idx )), shape=(length, width * height))
scales = np.zeros((A.shape[0]));
for kp in kps:
x,y = int(kp.pt[0]), int(kp.pt[1])
scales[y][x] = int(kp.size) # error
scales[y*x] = int(kp.size) # again, error:(
...
eq = np.linalg.lstsq(A, scales)
我更改了变量名称(
leng->length
,(s1,s2)->(width,height)
),并访问keypoint类中的size
成员,而不是matlab中的frames[3]
,但这些都是微小的更改
我不确定的是,对于scales
创建和索引访问,我到底应该做些什么。我似乎错过了什么,但找不到什么
我得到TypeError:'numpy.float64'对象不支持项分配
,这一点我并不感到惊讶,因为缩放
是一维数组,我不应该使用[]
访问它
但是,将其更改为scales[y*x]=int(kp.size)
会引发以下问题:linalgeror:0维数组给定。数组必须是二维的
据我所知,Matlab代码采用一个稀疏矩阵,创建一个列向量(
缩放
),然后填充该列向量,以使来自帧
(即Python代码中的每个帧(关键点
)的任何索引(x,y)
),并在所述索引处插入一个新值(值是frame(3)
的size
)。看起来很简单,但我不知道哪里出了问题
非常感谢您的帮助:)问题在于
np.linalg.lstsqr
是一个numpy函数,不理解稀疏矩阵。如果他们将任务委托给方法,Numpy函数就可以工作,但如果他们首先尝试将稀疏矩阵转换为数组,则无法工作
举个简单的例子:
In [345]: R = np.arange(1,6)
In [346]: M = sparse.csr_matrix(([1,1,1],([0,2,4],[0,1,2])),shape=(5,3))
In [347]: M.A
Out[347]:
array([[1, 0, 0],
[0, 0, 0],
[0, 1, 0],
[0, 0, 0],
[0, 0, 1]], dtype=int64)
In [348]: np.linalg.lstsq(M,R, rcond=None)
...
-> 1977 _assertRank2(a, b)
1978 _assertNoEmpty2d(a, b) # TODO: relax this constraint
1979 m = a.shape[0]
/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py in _assertRank2(*arrays)
193 if a.ndim != 2:
....
LinAlgError: 0-dimensional array given. Array must be two-dimensional
它认为M
的维数是0-d,而不是2-d。这是因为,在np.array
(或'asarray')中包装稀疏矩阵时,会生成0d对象数组:
In [351]: np.array(M)
Out[351]:
array(<5x3 sparse matrix of type '<class 'numpy.int64'>'
with 3 stored elements in Compressed Sparse Row format>, dtype=object)
In [352]: _.shape
Out[352]: ()
在MATLAB中,稀疏矩阵被集成到主代码中。在numpy
中,它们位于单独的scipy.sparse
包中。稀疏矩阵不是np.ndarray
的子类
有一个稀疏线性代数子包:
In [355]: from scipy.sparse import linalg as spla
In [356]: spla.lsqr(M, R)
Out[356]:
(array([1., 3., 5.]),
2,
1,
4.47213595499958,
4.47213595499958,
1.0,
1.0,
4.082652109348718e-16,
5.916079783099617,
array([0., 0., 0.]))
np.zeros((n,1))
创建列向量/数组。或者稍后使用重塑
或缩放[:,np.newaxis]
添加第二个维度。我不确定这种情况下的维度应该是什么。matlab代码不是创建了一个列向量吗,这正是我正在做的吗?np.zeros(n)是1d,不是列向量。你说的是我只需要加上`,1`?
In [355]: from scipy.sparse import linalg as spla
In [356]: spla.lsqr(M, R)
Out[356]:
(array([1., 3., 5.]),
2,
1,
4.47213595499958,
4.47213595499958,
1.0,
1.0,
4.082652109348718e-16,
5.916079783099617,
array([0., 0., 0.]))