CHOLMOD稀疏密集乘法问题
CHOLMOD sparse dense multiplication issue
我正在测试 cholmod 来求解稀疏矩阵系统。作为 Ax=b 等式的 b,我想使用会导致已知结果的东西,所以我选择将 1 和 b=A*xe.
的向量声明为 xe
我尝试了一些不同的方法来进行稀疏矩阵密集向量乘法,但没有成功。
作为第一个测试,我使用 SuitSparse matrix collection
中的 ex15 矩阵
#include "cholmod.h"
#include <iostream>
#pragma warning(disable:4996)
int main()
{
const char* matFile = "C:/www/CholeskyMatGPU/ex15.mtx";
const char* bfile = "C:/www/CholeskyMatGPU/b.mtx";
FILE* bp = fopen(bfile, "w");
FILE* fp = fopen(matFile, "r");
cholmod_sparse *A;
cholmod_dense *x, *xe, *b;
cholmod_factor *L;
cholmod_common* c = (cholmod_common*)malloc(sizeof(cholmod_common));
cholmod_l_start(c); /* start CHOLMOD */
c->useGPU = 0;
c->supernodal = CHOLMOD_SUPERNODAL;
A = cholmod_l_read_sparse(fp, c); /* read in a matrix */
cholmod_l_print_sparse(A, "A", c); /* print the matrix */
fclose(fp);
double alpha[2] = { 1., 0. };
double beta[2] = { 0., 0. };
xe = cholmod_l_ones(A->nrow, 1, A->xtype, c);
b = cholmod_l_allocate_dense(A->nrow, 1, A->nrow, CHOLMOD_LONG, c); //attempt1
b = cholmod_copy_dense(xe, c); //attempt2
b = cholmod_l_zeros(A->nrow, 1, A->xtype, c); //attempt3
cholmod_sdmult(A, 0, alpha, beta, xe, b, c); //b = A*xe
cholmod_l_write_dense(bp, b, "", c);
L = cholmod_l_analyze(A, c); /* analyze */
cholmod_l_factorize(A, L, c); /* factorize */
x = cholmod_l_solve(CHOLMOD_A, L, b, c); /* solve Ax=b */
}
我希望 b 是 A*xe 操作的结果,所以类似于
-4487487.55116591
228083519.121975
0.0561846979753665
18213301.5299736
...
30383411.1062435
8073.91311889887
0.00602254606925790
-7101038.89577146
378419792.843878
0.0931721845637848
(从matlab检查)
但是显示的代码将打印一个零向量,我用 sdmult 做的事情有问题。
A = Problem.A;
n = length(A);
xe(1:n,1) = 1;
b=A*xe;
R=chol(A);
tmp=(R'\b);
x=R\tmp;
这个问题是一个非常愚蠢的错误,方法名称中没有长前缀!
这不会抛出任何错误,但不会执行乘法。
使用 cholmod_l_sdmult(A, 0, alpha, beta, xe, b, c);
而不是 cholmod_sdmult(A, 0, alpha, beta, xe, b, c);
一切正常..
我正在测试 cholmod 来求解稀疏矩阵系统。作为 Ax=b 等式的 b,我想使用会导致已知结果的东西,所以我选择将 1 和 b=A*xe.
的向量声明为 xe我尝试了一些不同的方法来进行稀疏矩阵密集向量乘法,但没有成功。 作为第一个测试,我使用 SuitSparse matrix collection
中的 ex15 矩阵#include "cholmod.h"
#include <iostream>
#pragma warning(disable:4996)
int main()
{
const char* matFile = "C:/www/CholeskyMatGPU/ex15.mtx";
const char* bfile = "C:/www/CholeskyMatGPU/b.mtx";
FILE* bp = fopen(bfile, "w");
FILE* fp = fopen(matFile, "r");
cholmod_sparse *A;
cholmod_dense *x, *xe, *b;
cholmod_factor *L;
cholmod_common* c = (cholmod_common*)malloc(sizeof(cholmod_common));
cholmod_l_start(c); /* start CHOLMOD */
c->useGPU = 0;
c->supernodal = CHOLMOD_SUPERNODAL;
A = cholmod_l_read_sparse(fp, c); /* read in a matrix */
cholmod_l_print_sparse(A, "A", c); /* print the matrix */
fclose(fp);
double alpha[2] = { 1., 0. };
double beta[2] = { 0., 0. };
xe = cholmod_l_ones(A->nrow, 1, A->xtype, c);
b = cholmod_l_allocate_dense(A->nrow, 1, A->nrow, CHOLMOD_LONG, c); //attempt1
b = cholmod_copy_dense(xe, c); //attempt2
b = cholmod_l_zeros(A->nrow, 1, A->xtype, c); //attempt3
cholmod_sdmult(A, 0, alpha, beta, xe, b, c); //b = A*xe
cholmod_l_write_dense(bp, b, "", c);
L = cholmod_l_analyze(A, c); /* analyze */
cholmod_l_factorize(A, L, c); /* factorize */
x = cholmod_l_solve(CHOLMOD_A, L, b, c); /* solve Ax=b */
}
我希望 b 是 A*xe 操作的结果,所以类似于
-4487487.55116591
228083519.121975
0.0561846979753665
18213301.5299736
...
30383411.1062435
8073.91311889887
0.00602254606925790
-7101038.89577146
378419792.843878
0.0931721845637848
(从matlab检查) 但是显示的代码将打印一个零向量,我用 sdmult 做的事情有问题。
A = Problem.A;
n = length(A);
xe(1:n,1) = 1;
b=A*xe;
R=chol(A);
tmp=(R'\b);
x=R\tmp;
这个问题是一个非常愚蠢的错误,方法名称中没有长前缀!
这不会抛出任何错误,但不会执行乘法。
使用 cholmod_l_sdmult(A, 0, alpha, beta, xe, b, c);
而不是 cholmod_sdmult(A, 0, alpha, beta, xe, b, c);
一切正常..