对角化大型矩阵的工具

发布于 2024-09-03 07:00:30 字数 246 浏览 11 评论 0原文

我想计算一个扩散内核,其中涉及取 exp(b*A),其中 A 是一个大矩阵。为了使用 b 的值,我想对角化 A (以便 exp(A) 运行得更快)。

我的矩阵约为 25k x 25k,但非常稀疏 - 只有大约 60k 值是非零的。 Matlab 的“eigs”函数耗尽内存,octave 的“eig”和 R 的“eigen”也是如此。有没有一种工具可以找到大型稀疏矩阵的分解?

不知道这是否相关,但 A 是邻接矩阵,因此它是对称的,并且是满秩的。

I want to compute a diffusion kernel, which involves taking exp(b*A) where A is a large matrix. In order to play with values of b, I'd like to diagonalize A (so that exp(A) runs quickly).

My matrix is about 25k x 25k, but is very sparse - only about 60k values are non-zero. Matlab's "eigs" function runs of out memory, as does octave's "eig" and R's "eigen." Is there a tool to find the decomposition of large, sparse matrices?

Dunno if this is relevant, but A is an adjacency matrix, so it's symmetric, and it is full rank.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

迷迭香的记忆 2024-09-10 07:00:30

您是否在 matlab 中尝试过 SVD、svds 来处理稀疏矩阵?

编辑:还有一件事,不要做全等级 SVD,因为维度很大,使用一个小等级,比如 500,以便您的解决方案适合内存。这会删除小特征值及其向量。因此,它不会对你的准确性造成太大影响。

Have you tried SVD, svds for sparse matrix in matlab.

EDIT: one more thing, don't do full rank SVD since the dimension is big, use a small rank, say 500, so that your solution fits in the memory. This cuts the small eigenvalues and their vectors out. Thus it does not hurt your accuracy much.

你是暖光i 2024-09-10 07:00:30

您是否考虑过以下属性
exp(A*t) = L^(-1) {(sI-A)^(-1)}
其中 L^(-1) 是拉普拉斯逆变换? - 前提是你可以反转 (sI-A)

Have you considered the following property:
exp(A*t) = L^(-1) {(sI-A)^(-1)}
where L^(-1) the inverse Laplace transform? - provided that you can invert (sI-A)

梦与时光遇 2024-09-10 07:00:30

如果您可以访问 64 位机器并且使用 64 位支持编译的 Octave,则可能能够解决此问题。

另外,我不知道您在哪个平台上运行所有这些,但在基于 UNIX 的系统中,您可以使用 ulimit 来增加用户进程允许的最大堆栈大小。

例如,您可以运行

ulimit -u unlimited

,这将确保您的进程没有内存限制等。一般来说,这不是一个好主意,因为失控的进程将完全使您的机器陷入困境。尝试

ulimit -s [stacksize]

增加堆栈大小限制。

If you have access to a 64 bit machine and octave compiled with 64 bit support, you might be able to get around this problem.

Also, I don't know what platform you are running all of this on, but in UNIX based systems you can use ulimit to increase the maximum allowed stack size for user processes.

For example, you can run

ulimit -u unlimited

and this will ensure that there are no memory limits etc on your processes. This is not a good idea in general, since you have have runaway processes that will completely bog down your machine. Try instead

ulimit -s [stacksize]

to increase the stack size limit.

残龙傲雪 2024-09-10 07:00:30

Octave 有 slu,它可以对稀疏矩阵进行 lu 分解。我不确定它是否可以处理 25k x 25k,但值得一试。

或者,如果您的矩阵结构如下:A = [B zeros;zeros C] 那么您可以分别对角化 B 和 C 并将它们放在一起形成一个矩阵。我猜你可以为 eig 做类似的事情。

Octave has splu which does lu decomposition for sparse matrices. I am not sure whether it can handle 25k x 25k but worth a shot.

Alternatively if your matrix is structured like so: A = [B zeros;zeros C] then you can diagonalize B and C separately and put them together into one matrix. I am guessing you can do something similar for eig.

眼中杀气 2024-09-10 07:00:30

在 R 中,您可以检查 igraph 包 和函数 arpack 是 ARPACK 库 的接口。

In R you could check igraph package and function arpack which is interface to ARPACK library.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文