- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 SuiteSparse 中使用 CHOLMOD 来因式分解 N
通过 N
相对稀疏的大带对角矩阵,即它仅包含一些非零对角线。矩阵的稀疏性由协方差长度参数设置 l
.较大的l
非零的非对角线元素的数量越多。
当 l
变大且许多元素非零,超节点 CHOLMOD 分解突然开始失败,并显示错误消息“CHOLMOD 警告:矩阵不是正定的。”通过使用单独的 Python 实现检查数学,我知道矩阵应该是正定的。此外,当我从
Common->.supernodal = CHOLMOD_SUPERNODAL;
到
Common->supernodal = CHOLMOD_SIMPLICIAL;
分解将成功。对于下面的代码示例,只要l < 2.5
,超节点分解就会成功。 .如果我增加 l >= 3.0
,我得到矩阵不是正定的错误。然而,如果我随后选择 CHOMOD_SIMPLICIAL,分解就会成功。任何人都可以帮助我确定为什么 CHOLMOD_SUPERNADAL 突然在某个稀疏度/密度之上失败了吗?谢谢!
//file is cov.c
//Compile with $ gcc -Wall -o cov -Icholmod cov.c -lm -lcholmod -lamd -lcolamd -lblas -llapack -lsuitesparseconfig
#include <stdio.h>
#include <math.h>
#include "cholmod.h"
#define PI 3.14159265
float k_3_2 (float r, float a, float l, float r0)
{
return (0.5 + 0.5 * cos(PI * r/r0)) * pow(a, 2.) * (1 + sqrt(3) * r/l) * exp(-sqrt(3) * r/l) ;
}
// function to initialize an array of increasing wavelengths
void linspace (double *wl, int N, double start, double end)
{
double j; //double index
double Ndist = (double) N;
double increment = (end - start)/(Ndist -1.);
int i;
for (i = 0; i < N; i++) {
j = (double) i;
wl[i] = start + j * increment;
}
}
// create and return a sparse matrix using a wavelength array and parameters
// for a covariance kernel.
cholmod_sparse *create_sparse(double *wl, int N, double a, double l, cholmod_common *c)
{
double r0 = 6.0 * l; //Beyond r0, all entries will be 0
//Pairwise calculate all of the r distances
int i = 0, j = 0;
double r;
//First loop to determine the number non-zero elements
int M = 0; //number of non-zero elements
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
r = fabs(wl[i] - wl[j]);
if (r < r0) //Is the separation below our cutoff?
M++;
}
}
/* Initialize a cholmod_triplet matrix, which we will subsequently fill with
* values. This matrix is NxN sparse with M total non-zero elements. 1 means we
* want a square and symmetric matrix. */
cholmod_triplet *T = cholmod_allocate_triplet(N, N, M, 1, CHOLMOD_REAL, c);
if (T == NULL || T->stype == 0) /* T must be symmetric */
{
cholmod_free_triplet (&T, c) ;
cholmod_finish (c) ;
return (0) ;
}
//Do the loop again, this time to fill in the matrix
int * Ti = T->i;
int * Tj = T->j;
double * Tx = T->x;
int k = 0;
//This time, only fill in the lower entries (and diagonal).
for (i = 0; i < N; i++)
{
for (j = 0; j <= i; j++)
{
r = fabs(wl[i] - wl[j]);
if (r < r0) //If the distance is below our cutoff, initialize
{
Ti[k] = i;
Tj[k] = j;
Tx[k] = k_3_2(r, a, l, r0);
k++;
}
}
}
T->nnz = k;
//The conversion will transpose the entries and add to the upper half.
cholmod_sparse *A = cholmod_triplet_to_sparse(T, k, c);
cholmod_free_triplet(&T, c);
return A;
}
int main(void)
{
//Create a sample array of wavelengths for testing purposes.
int N = 3000;
double wl[N];
linspace(wl, N, 5100., 5200.); //initialize with wavelength values
cholmod_common c ; //c is actually a struct, not a pointer to it.
cholmod_start (&c) ; // start CHOLMOD
c.print = 5;
//c.supernodal = CHOLMOD_SIMPLICIAL;
c.supernodal = CHOLMOD_SUPERNODAL;
float l = 2.5;
cholmod_sparse *A = create_sparse(wl, N, 1.0, l, &c);
cholmod_factor *L ;
L = cholmod_analyze (A, &c) ;
cholmod_factorize (A, L, &c) ;
printf("L->minor = %d\n", (int) L->minor);
cholmod_dense *b, *x, *r;
//Create a vector with the same number of rows as A
b = cholmod_ones (A->nrow, 1, A->xtype, &c) ; // b = ones(n,1)
x = cholmod_solve (CHOLMOD_A, L, b, &c) ; // solve Ax=b
//the reason these are length two is because they can be complex
double alpha [2] = {1,0}, beta [2] = {0,0} ; // basic scalars
r = cholmod_copy_dense (b, &c) ; // r = b
cholmod_sdmult (A, 0, alpha, beta, x, r, &c) ; // r = Ax
cholmod_print_dense(r, "r", &c); //This should be equal to b
cholmod_free_sparse(&A, &c); // free all of the variables
cholmod_free_factor(&L, &c);
cholmod_free_dense(&b, &c);
cholmod_free_dense(&x, &c);
cholmod_free_dense(&r, &c);
cholmod_finish (&c) ; // finish CHOLMOD
return (0) ;
}
最佳答案
使用您的代码,您似乎正在创建病态矩阵并要求 CHOLMOD 处理它们。当我告诉它对失败的情况进行简单分解时,我得到了大约 1e-7 的倒数条件数(使用 cholmod_rcond
计算)。当 l = 2.5
时,我得到了 2e-6
附近的倒数条件数。请注意,float
的机器 epsilon 就在附近……
如果我在您的 k_3_2
声明中将所有 float
替换为 double
,它似乎不再失败。 (我没有看过你的矩阵里面有什么,所以除了说 pow(a, 2.)
是一个糟糕的平方方法之外我不打算进一步评论。)
我不知道为什么你会因为条件显然不那么差的矩阵而失败。我不完全确定 CHOLMOD 的超节点分解是如何实现的细节,但我相信它调用了 BLAS 的 dpotrf
来进行小密集分解和 dsyrk
来处理与 block 的其余部分。快速的 dpotrf
或 dsyrk
可能会让您感到悲伤。此外,CHOLMOD 为矩阵的一些结构为零的元素创建非零值,以便它可以使用 BLAS,这可能会让您有点失望。
关于当稀疏矩阵变得过于密集时,CHOLMOD 超节点分解失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22774929/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!