У меня есть структура данных 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:
- Плотность cholmod: плотная матрица, действительная, сложная или zomplex, в мажорном столбце. Это отличается от соглашения о мажорной строке, используемого в C. Плотная матрица X содержит
• X-> x, двойной массив размером X-> nzmax или вдвое больше, чем для сложного случая. • X-> z, двойной массив размера X-> nzmax, если X zomplex.
Поэтому я должен иметь возможность просто взять ex-> x и индексировать его как двойной массив, но я не могу сделать это без ошибки сегментации. Может кто-нибудь мне помочь?
Библиотека CHOLMOD написана на C, а код, который ссылается на библиотеку CHOLMOD (фрагмент кода показан выше), — это c ++.
Хорошо, похоже, я сделал пару ошибок.
Прежде всего, я столкнулся с ошибкой сегментации, потому что я использовал 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];
Я также не знал, что []
Оператор автоматически разыменовывает указатели. Хорошо знать!
Других решений пока нет …