Построение матрицы диагональных блоков с некоторыми блоками в качестве переменных CVXPY

Я хочу создать (диагональную) блочную матрицу (желательно разреженную) в CVXPY.

Некоторые блоки могут быть eye(m) или любым другим, но у меня есть блок, который:

from cvxopt import *
import cvxpy as cvx
import numpy as np
import scipy
W = cvx.Variable(m,1)
W_diag = cvx.diag(W)

Затем я попытался сформировать блочную диагональную матрицу с W_diag в качестве блока, например, следующим образом:

T = scipy.sparse.block_diag((scipy.sparse.eye(m1).todense(), cvx.diag(W))

и я получил следующую ошибку:

TypeError: не поддерживается преобразование типов: (dtype('float64'), dtype('O'))

Что я могу сделать? Другие способы? Я хочу использовать матрицу T в ограничении для CVXPY позже.


person hoot    schedule 28.10.2014    source источник


Ответы (1)


Вы не можете использовать объекты CVXPY в функциях SciPy и NumPy. Вам необходимо создать блочную диагональную матрицу с помощью CVXPY. Этот код будет работать для вашего примера:

import cvxpy as cvx
import numpy as np
W = cvx.Variable(m)
B = np.ones(m)
T = cvx.diag(cvx.vstack(B, W))

Сейчас в CVXPY нет функции block_diag, но я могу добавить ее, если она все еще будет вам полезна.

person steven    schedule 13.12.2014