Индексирование в массив плотных векторов CHOLMOD

У меня есть структура данных cholmod_dense:

cholmod_dense* ex = cholmod_l_solve(CHOLMOD_A, L, B, &com);

и я хочу извлечь значения и скопировать их в другую переменную. Это означает, что мне нужно индексировать в двойной массив и копировать значения.

for (int k=0; k<ncols; k++) T_x[k]=((double*)ex->x)[k];

с компилятором все в порядке, но я получаю ошибку сегментации. Или я думаю, что я должен быть в состоянии сделать:

double* e_x =(double*)ex->x;
for (int k=0; k<ncols; k++) T_x[k]=*e_x[k];

Но компилятору действительно не нравится это:

error: invalid type argument of unary ‘*’ (have ‘double’)
for (int k=0; k<ncols; k++) T_x[k]= *e_x[k];

Согласно руководству пользователя CHOLMOD:

  1. Плотность cholmod: плотная матрица, действительная, сложная или zomplex, в мажорном столбце. Это отличается от соглашения о мажорной строке, используемого в C. Плотная матрица X содержит
    • X-> x, двойной массив размером X-> nzmax или вдвое больше, чем для сложного случая. • X-> z, двойной массив размера X-> nzmax, если X zomplex.

Поэтому я должен иметь возможность просто взять ex-> x и индексировать его как двойной массив, но я не могу сделать это без ошибки сегментации. Может кто-нибудь мне помочь?

Библиотека CHOLMOD написана на C, а код, который ссылается на библиотеку CHOLMOD (фрагмент кода показан выше), — это c ++.

0

Решение

Хорошо, похоже, я сделал пару ошибок.

Прежде всего, я столкнулся с ошибкой сегментации, потому что я использовал cholmod_l_zeros(); что предполагает long integers, Вместо этого я должен использовать cholmod_zeros(); так как я использую doubles,

После исправления этого я столкнулся с ошибкой CHOLMOD error: invalid xtype сразу после моего cholmod_solve(CHOLMOD_A, L, B, &com); заявление. Это было потому, что мой cholmod_factor* L был определен вне области. После устранения обеих проблем код успешно копирует значения из cholmod_dense ex->x double array к моему T_x double vector:

cholmod_dense* ex = cholmod_solve(CHOLMOD_A, L, B, &com);
double* e_x = (double*)ex->x;
for (int k=0; k<ncols; k++) T_x[k] = e_x[k];

Я также не знал, что [] Оператор автоматически разыменовывает указатели. Хорошо знать!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]