0

我有一个 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 dense:一个密集矩阵,可以是实数、复数或 zomplex,以列优先顺序排列。这与 C 中使用的行优先约定不同。密集矩阵 X 包含 • X->x,一个大小为 X->nzmax 的双精度数组,或者是复杂情况的两倍。• X->z,如果X 是zomplex,则为大小为X->nzmax 的双精度数组。

所以我应该能够简单地抓取 ex->x 并将其作为双数组索引,但如果没有分段错误,我就无法这样做。谁能帮我吗?

CHOLMOD 库是用 C 编写的,链接到 CHOLMOD 库的代码(上面显示的代码片段)是 c++。

4

1 回答 1

0

好的,所以看起来我犯了几个错误。

首先,我遇到了分段错误,因为我使用的是cholmod_l_zeros();which assumes long integers。相反,我应该使用,cholmod_zeros();因为我正在使用doubles.

CHOLMOD error: invalid xtype解决此问题后,我在声明后立即遇到了错误cholmod_solve(CHOLMOD_A, L, B, &com);。这是因为 mycholmod_factor* L的定义超出了范围。解决这两个问题后,代码成功地将值从cholmod_dense ex->x double arrayover 复制到 my 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];

我也不知道[]操作员会自动取消引用指针。很高兴知道!

于 2017-07-28T18:26:11.133 回答