我正在尝试使用PyCall在Julia中创建一个cvxopt.spmatrix对象(see cvxopt doc)。但是,如果我运行以下代码:
using PyCall
@pyimport cvxopt as cvx
I = [0.0 1 3 1 5 2 6 3 4 5 4 5 6 5 6]
J = [0.0 0 0 1 1 2 2 3 3 3 4 4 4 5 6]
B = cvx.spmatrix(0.1,I,J)
我收到以下错误消息:
错误:LoadError:PyError(ccall(@pysym(:PyObject_Call),PyPtr, (PyPtr,PyPtr,PyPtr),o,arg,C_NULL)) TypeError('无效的数组类型',)
我相信这是因为PyCall Wrapper将Julia数组I,J转换为与spmatrix构造函数不兼容的Python数组。我认为它想要一个Python列表。
我知道cvx有一个Julia接口,但我需要spmatrix用于不同的目的。 任何想法如何解决这个问题? 非常感谢你的帮助!
答案 0 :(得分:2)
这里有两个问题:
B = cvx.spmatrix(0.1,Int.(I), Int.(J))
会给出:
错误:PyError(ccall(@pysym(:PyObject_Call),PyPtr,(PyPtr,PyPtr, PyPtr),o,arg,C_NULL)) TypeError('不支持缓冲格式',)
这可能与PyCall复制这些数组但直接传递它们(通常是好事)有关。一个hacky解决方法是这样做(假设我和J现在是整数数组):
B = cvx.spmatrix(0.1, (I...), (J...))
PyObject< 7x7稀疏矩阵,tc =' d',nnz = 15>
可能有更好的方法。