索引 CHOLMOD 密集向量数组

Posted

技术标签:

【中文标题】索引 CHOLMOD 密集向量数组【英文标题】:Indexing into CHOLMOD dense vector array 【发布时间】:2017-07-28 00:21:32 【问题描述】:

我有一个 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 是 zomplex,则为大小为 X->nzmax 的双精度数组。

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

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

【问题讨论】:

哪种语言,C C++,因为它们是两种不同的语言?例如,C++ 有std::vectorstd::array,其中可以有一个向量数组。 C 语言只有固定大小的数组。另外,C++ 语言有static_cast&lt;&gt; 请使用编译器中的“不喜欢”文本编辑您的帖子。 什么是ncols *e_x[k] 您正在尝试取消引用 double。你的意思是T_x[k] *= e_x[k] 【参考方案1】:

好吧,看来我犯了几个错误。

首先,我遇到了分段错误,因为我使用的是cholmod_l_zeros();,它假定long integers。相反,我应该使用cholmod_zeros();,因为我使用的是doubles

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

我也不知道[] 运算符会自动取消引用指针。很高兴知道!

【讨论】:

以上是关于索引 CHOLMOD 密集向量数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DataFrame 转换为密集向量数组?

为啥 scipy 的稀疏 csr_matrix 的向量点积比 numpy 的密集数组慢?

带有浮点索引的 C++ 数组/向量

word2vec:主要概念和流程

稀疏向量与密集向量

转换向量索引超出数组边界 - matlab