【发布时间】:2018-08-12 09:47:22
【问题描述】:
我应该如何将这个从 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_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)
我更改了变量名称(len -> length、(s1,s2) -> (width, height)),并在关键点类中访问 size 成员,而不是在 matlab 中访问 frames[3],但这些都是微小的变化。
我不确定的是,我究竟应该如何处理 scales 创建和索引访问。我似乎错过了什么,但找不到什么。
我得到了TypeError: 'numpy.float64' object does not support item assignment,这并不让我感到惊讶,因为scales 是一维数组,我不应该使用[][] 访问它。
但是,将其更改为 scales[y*x] = int(kp.size) 会引发以下问题:LinAlgError: 0-dimensional array given. Array must be two-dimensional。
据我了解,Matlab 代码采用稀疏矩阵,创建一个列向量 (scales),然后填充该列向量,以便 frame 中的任何索引 (x,y)(即每帧的索引 (=@987654336 @ 在我的 Python 代码中))并在所述索引处插入一个新值(该值是 size 的 frame(3))。看起来很简单,但我不知道我哪里出错了。
任何帮助将不胜感激,谢谢:)
【问题讨论】:
-
np.zeros((n, 1))创建一个列向量/数组。或者稍后使用reshape或scales[:, np.newaxis]添加第二个维度。 -
我不确定在这种情况下尺寸应该是多少。 matlab代码不是创建列向量,这正是我正在做的吗?
-
np.zeros(n] 是 1d,不是列向量
-
所以你的意思是我只需要添加`,1`?
标签: python python-2.7 matlab numpy sparse-matrix