- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在使用 CHOLMOD 分解矩阵 A 并求解系统 Ax = b,因为 A 是 Hessian 矩阵(打印在下面)并且 b = [1, 1, 1] 由 cholmod_ones
函数。
不幸的是,x 的解不正确(应该是 [1.5, 2.0, 1.5]),为了确认我将 A 和 x 重新相乘,没有得到 [1, 1, 1]。我不太明白我做错了什么。
此外,我查看了因子,矩阵元素的值也没有意义。
输出
Hessian:
2.000 -1.000 0.000
-1.000 2.000 -1.000
0.000 -1.000 2.000
Solution:
2.500 0.000 0.000
3.500 0.000 0.000
2.500 0.000 0.000
B vector:
1.500 0.000 0.000
2.000 0.000 0.000
1.500 0.000 0.000
代码
iterate_hessian()
是一个外部函数,它返回读入 CHOLMOD hessian 矩阵的 double 值。
代码的入口点是 cholesky_determinant
,调用时带有一个给出(方)矩阵维数的参数。
#include <cholmod.h>
#include <string.h>
// Function prototype that gives the next value of the Hessian
double iterate_hessian();
cholmod_sparse *cholmod_hessian(double *hessian, size_t dimension, cholmod_common *common) {
// This function assigns the Hessian matrix from OPTIM to a dense matrix for CHOLMOD to use.
// Allocate a dense cholmod matrix of appropriate size
cholmod_triplet *triplet_hessian;
triplet_hessian = cholmod_allocate_triplet(dimension, dimension, dimension*dimension, 0, CHOLMOD_REAL, common);
// Loop through values of hessian and assign their row/column index and values to triplet_hessian.
size_t loop;
for (loop = 0; loop < (dimension * dimension); loop++) {
if (hessian[loop] == 0) {
continue;
}
((int*)triplet_hessian->i)[triplet_hessian->nnz] = loop / dimension;
((int*)triplet_hessian->j)[triplet_hessian->nnz] = loop % dimension;
((double*)triplet_hessian->x)[triplet_hessian->nnz] = hessian[loop];
triplet_hessian->nnz++;
}
// Convert the triplet to a sparse matrix and return.
cholmod_sparse *sparse_hessian;
sparse_hessian = cholmod_triplet_to_sparse(triplet_hessian, (dimension * dimension), common);
return sparse_hessian;
}
void print_matrix(cholmod_dense *matrix, size_t dimension) {
// matrix->x is a void pointer, so first copy it to a double pointer
// of an appropriate size
double *y = malloc(sizeof(matrix->x));
y = matrix->x;
// Loop variables
size_t i, j;
// Row
for(i = 0; i < dimension; i++) {
// Column
for(j = 0; j < dimension; j++) {
printf("% 8.3f ", y[i + j * dimension]);
}
printf("\n");
}
}
cholmod_dense *factorized(cholmod_sparse *sparse_hessian, cholmod_common *common) {
cholmod_factor *factor;
factor = cholmod_analyze(sparse_hessian, common);
cholmod_factorize(sparse_hessian, factor, common);
cholmod_dense *b, *x;
b = cholmod_ones(sparse_hessian->nrow, 1, sparse_hessian->xtype, common);
x = cholmod_solve(CHOLMOD_LDLt, factor, b, common);
cholmod_free_factor(&factor, common);
// Return the solution, x
return x;
}
double cholesky_determinant(int *dimension) {
// Declare variables
double determinant;
cholmod_sparse *A;
cholmod_dense *B, *Y;
cholmod_common common;
// Start CHOLMOD
cholmod_start (&common);
// Allocate storage for the hessian (we want to copy it)
double *hessian = malloc(*dimension * *dimension * sizeof(hessian));
// Get the hessian from OPTIM
int i = 0;
for (i = 0; i < (*dimension * *dimension); i++) {
hessian[i] = iterate_hessian();
}
A = cholmod_hessian(hessian, *dimension, &common);
printf("Hessian:\n");
print_matrix(cholmod_sparse_to_dense(A, &common), *dimension);
B = factorized(A, &common);
printf("Solution:\n");
print_matrix(B, *dimension);
double alpha[] = {1, 0};
double beta[] = {0, 0};
Y = cholmod_allocate_dense(*dimension, 1, *dimension, CHOLMOD_REAL, &common);
cholmod_sdmult(A, 0, alpha, beta, B, Y, &common);
printf("B vector:\n");
print_matrix(Y, *dimension);
determinant = 0.0;
// Free up memory and finish CHOLMOD
cholmod_free_sparse (&A, &common);
cholmod_free_dense (&B, &common);
cholmod_finish (&common);
return determinant;
}
最佳答案
事实证明我没有正确设置我的稀疏矩阵的类型。 stype 决定了对称性(以及调用 cholmod_factorize
的后续行为)。它实际上是对 AA' 进行因式分解和求解。
关于CHOLMOD 稀疏矩阵 cholesky 分解 : incorrect factor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12956980/
我正在开发一种算法,可以求解 Ax= b,其中 A 和 b 已知。 有两种方法可以实现此目的:x= A-1 b 或使用 Cholesky。我知道矩阵始终是方正定矩阵,尽管 det(A) 可能为零。在极
我真的很想评估你们中是否有任何人可以指出我在 Cholesky 分解 方面最优化和计算速度最快的线性代数库。 到目前为止,我一直在使用 Apache Commons Math 库,但也许已经有更强大和
我对 c 相当陌生,想根据维基百科的伪代码实现 cholesky 分解。需要动态分配内存。 我用以下示例矩阵尝试了我的代码: 4.000 2.000 0.000 0.000 2.000 5
double *cholesky(double *A, int n) { double *L = (double*)calloc(n * n, sizeof(double)); if
我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩
我正尝试在 C++ 中实现 Cholesky 分解,它以前在 lapack dpotrf_ 中实现过. Cholesky 分解:R' * R = A 代码: #include #include l
我正在使用 python 的 scikits.sparse.cholmod 来获取对称矩阵的 cholesky 分解。 我将 cholesky() 的结果与 matlab 的 chol() 进行了比较
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我使用 OpenCL 实现了以下 Cholesky 分解算法。该代码表现出随机行为。它仅在某些时候匹配 cpu 输出。有人可以帮我弄清楚我的实现有什么问题吗。 算法如下: procedure CHOL
我对大型稀疏矩阵的 Cholesky 分解很感兴趣。我遇到的问题是 Cholesky 因子不一定是稀疏的(就像两个稀疏矩阵的乘积不一定是稀疏的一样)。 例如,对于仅沿第一行、第一列和对角线具有非零值的
我正在尝试通过 pdpotrf() 进行 Cholesky 分解MKL-Intel 的库,它使用 ScaLAPACK。我正在读取主节点中的整个矩阵,然后像在这个 example 中一样分发它.当 SP
Cholesky Decomposition 有两种不同的形式: A = M * ctranspose (M) 和 LDL 形式 A = L * D * ctranspose (L) 其中 ctran
我想用 Sympy 找到一个符号 Cholesky 分解。矩阵 M(参见示例)是实对称的(因此是埃尔米特矩阵)。但 Sympy 引发 ValueError:矩阵必须是厄米特矩阵。 两个问题: 为什么会
我想使用 Eigen 来计算稀疏矩阵的 cholesky 分解。但是,结果不正确,我找不到原因。我如何获得正确答案? Eigen 中是否实现了特殊例程,利用稀疏矩阵的结构来提高性能(例如,对于下例中的
OpenCV 中是否有任何函数可用于对矩阵应用 Cholesky 分解? 最佳答案 如果仍然相关,OCV 3.0.0 直接通过 HAL 接口(interface)支持 Cholesky。参见 cv::
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow
我想获得 tf.cholesky 相对于其输入的梯度。目前,tf.cholesky 没有注册梯度: LookupError: No gradient defined for operation 'Ch
我想知道是否有人可以帮助我调试以下应该计算正定矩阵的上三角 cholesky 分解的 OCaml 代码。 我知道它不是很实用而且很笨重,所以我提前道歉。我在下面给出了一些原因。 不管怎样,这就过去了!
我正在尝试在 Halide 中实现 Cholesky 分解。部分常见算法(例如 crout)由对三角矩阵的迭代组成。在某种程度上,分解的对角线元素是通过从输入矩阵的对角线元素中减去部分列和来计算的。列
谁能给我指出一个库/代码,让我可以在 python (numpy) 中对 Cholesky 分解执行低阶更新?Matlab 将此功能作为称为“cholupdate”的函数提供。LINPACK 也有这个
我是一名优秀的程序员,十分优秀!