使用PyCall在Julia中创建cvxopt.spmatrix

时间:2017-11-28 11:15:32

标签: python julia cvxopt

我正在尝试使用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用于不同的目的。 任何想法如何解决这个问题? 非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

这里有两个问题:

  1. 正如@sascha指出我和我J是索引,因此需要是整数列表(在链接手册中指定)。
  2. 第二个问题我不完全理解,但有一个简单的(如果可能没有高效的解决方法)。
  3. 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>

    可能有更好的方法。