使用 PyCall 在 Julia 中创建 cvxopt.spmatrix

Create cvxopt.spmatrix in Julia using PyCall

我正在尝试使用 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)

我收到以下错误消息:

ERROR: LoadError: PyError (ccall(@pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, arg, C_NULL)) TypeError('invalid array type',)

我认为这是因为 PyCall Wrapper 将 Julia 数组 I、J 转换为与 spmatrix 构造函数不兼容的 Python 数组。我认为它需要一个 Python-列表。

我知道有一个用于 cvx 的 Julia 接口,但我需要 spmatrix 用于不同的目的。 任何想法如何解决这个问题? 非常感谢您的帮助!

这里有两个问题:

  1. 正如@sascha 指出的那样,I 和 J 是索引,因此需要是整数列表(如链接手册中所指定)。
  2. 第二个问题我不完全理解,但有一个简单的(如果可能不是高性能的解决方法)。

B = cvx.spmatrix(0.1,Int.(I), Int.(J)) 将给出:

ERROR: PyError (ccall(@pysym(:PyObject_Call), PyPtr, (PyPtr, PyPtr, PyPtr), o, arg, C_NULL)) TypeError('buffer format not supported',)

这可能与 PyCall 不复制这些数组而是直接传递它们(通常是一件好事)这一事实有关。一个棘手的解决方法是这样做(假设 I 和 J 现在是整数数组):

B = cvx.spmatrix(0.1, (I...), (J...))

PyObject <7x7 sparse matrix, tc='d', nnz=15>

虽然可能有更好的方法。