问题标签 [lapack]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 用 lapack 计算倒数条件数(即 rcond(x))
我希望使用 C 中的 LAPACK 在 MATLAB/Octave 中完成 rcond 所做的事情。MATLAB 手册告诉我使用了 dgecon,即使用基于 1 的规范。
我为一个极其简单的案例编写了一个简单的测试程序;[1,1; 1,0] 对于这个输入,matlab 和 octave 使用 rcond 和 1/cond(x,1) 给我 0.25,但在使用 LAPACK 的情况下,这个示例程序打印 0.0。对于其他情况,例如身份,它会打印正确的值。
由于假设 MATLAB 实际上成功地使用了这个例程,我做错了什么?我试图破译 Octave 的功能,但收效甚微,因为它被包裹在
用 cc testdgecon.c -o testdgecon -llapack 编译;./testdgecon
c++ - 使用 LAPACK 访问子矩阵
LAPACK 中是否有一个函数,它将为我提供特定子矩阵的元素?如果是这样,C++ 中的语法是什么?
还是我需要编码?
linear-algebra - LAPACK SVD(奇异值分解)
你知道任何使用 LAPACK 计算 SVD 的例子吗?
math - 如何计算上三角矩阵的 SVD(奇异值分解)
你知道使用 BLAS 或 LAPACK 计算 SVD 的算法吗?
假设我有一个对称矩阵 A:
从A得到上三角矩阵G后:
- 如何计算 A 的 SVD,但使用 G 的值?
- 我必须通过所有矩阵 A 还是足以通过 G(中间矩阵)?
事实上,我在处理 G 矩阵后得到,但是作为它的对称矩阵,我如何计算对称 A 的 SVD,只有 G(换句话说,只有 A 的上三角矩阵)?
lapack - 分解LAPACK
您能否在 LAPACK 上提供这 3 个分解的示例,或者只是一个想法如何使用这个库来解决它们?
c++ - LAPACK/BLAS 与简单的“for”循环
我想将一段涉及大量向量和矩阵计算的代码迁移到 C 或 C++,目标是尽可能加快代码速度。
在 C 代码中使用循环的线性代数计算是否与for
使用 LAPACK/BLAS 的计算一样快,或者使用这些库有一些独特的加速?
换句话说,简单的 C 代码(使用for
循环等)可以像使用 LAPACK/BLAS 的代码一样快地执行线性代数计算吗?
.net - 高效流程 SQL Server 和数值方法库
有没有办法交流一个数字方法库,它可以利用所有.net's
(numerical methods
由.net
它调用SQL Server
)habilities?
- 您推荐什么库,也许使用
MATLAB
,R
? - 如何
SQL Server
与.net
这样的图书馆或图书馆进行交流? - 你有一个例子吗?
- 必须遵循哪些步骤才能在和
numerical libraries
之间建立联系.net
SQL Server
linear-algebra - 密集线性代数的应用
密集线性代数的常见实际应用是什么?
使用线性代数作为人类和计算机之间的通用语言,可以轻松描述和有效计算许多问题。尽管这些系统通常需要稀疏矩阵的解,而不是密集矩阵的解。违反此规则的常见应用程序有哪些?
我很好奇社区是否应该投入更多时间来改进LAPACK等 DLA 软件包。谁在计算受限的应用程序中使用LAPACK ?谁使用LAPACK来解决需要并行性的大问题?
具体来说,由于密集线性代数能力不足,目前无法解决的问题有哪些。
c# - 任何 DBMS 都可以发送/接收巨大的矩阵吗?
我正在尝试与LAPACK库通信,.net
因此我可以在 DBMS 之外进行一些处理。
是否可以将send/receive
矩阵完成为二进制或直接内存指针来处理它们?主要目的是提高速度并避免通过平面文件。
- 是否有可能
Oracle, SQL Server, MySQL
支持这种技术? - 图书馆怎么样
LAPACK
,我们可以将二进制文件或其他东西导出到.net
,或者c#
?(全部通过原始内存指针或二进制文件)
c - 处理器子集上的不相交网格及其在 Scalapack 中的通信
总之,我的问题是关于如何在Scalapack(BLACS)中的两个不同进程网格上的两个块循环分布矩阵之间实现矩阵复制。我正在尝试使用 pdgemr2d_ 来实现这一点,我经常在其他情况下使用它,我在同一进程网格上的两个矩阵之间进行复制。
下面是对我遇到的问题状态的相当技术性的讨论。我已经把它归结为一个基本问题,但在我看来没有解决方案......虽然必须有,因为 Scalapack 特别指出我正在尝试的操作类型是可能的。我在任何地方都找不到足够的例子。
在 C 中使用 MPI 运行的 Scalapack 中的 1x1 计算网格的初始化通常如下所示:
此代码将生成一个 1x1 网格,无论 MPI 知道多少处理器({1, 1},网格的大小,被传递给 Cblacs_gridinit)。在这里,CONTEXT 向 Scalapack 函数指示我们正在处理哪个网格(可以同时使用多个网格,并且由 Cblacs_get 生成)。Cblacs_gridinfo 将 NPROW 和 NPCOL 设置为处理器行数和列数(在本例中为 {1, 1})。MYPROW 和 MYPCOL 向每个处理器指示哪个网格块属于它。在这种情况下,在 1x1 网格上,只有一个处理器参与,其网格 ID 为 {0, 0}。
为简单的块循环分布式 100x100 矩阵初始化矩阵描述符通常也很简单:
(稍后我们将看到为什么需要“保护”变量,因为在某些处理器上 num_cols_local 或 num_rows_local 将非常正确地返回为负整数。)
上面的大部分内容都是不言自明的,除了传递给 descinit_ 的 &zeros,它表示矩阵的第一行所在的处理器行,以及第一列所在的处理器列。这些值在 descinit_ 函数中使用时具有非常明确的界限。从 Fortran 函数本身来看,
我们在这里将 IRSRC 和 ICSRC 作为零传递,因为 {0,0} 是我们单个网格块的正确索引。即使网格大得多,我们可能仍会传递 {0,0},因为第一个处理器块可能会存储第一行和第一列的值。
在一个处理器上运行时,效果很好。NPROW、NPCOL、MYPROW 和 MYPCOL 的唯一处理器 RANK 0 上的值分别为 1、1、0 和 0。在这种情况下,CONTEXT 为 0,它的非负性表明它所指的网格在此 RANK 上是活动的。这些值表示存在 1x1 进程网格,并且第一个处理器具有正确的表示属于 RANK 0 的正确进程网格块。在这种情况下,它是唯一的块。
然而,当在两个处理器上运行时,事情会发生故障,而且它们不应该正式出现。在第一个和第二个 RANK 中,我们有 CONTEXT、NPROW、NPCOL、MYPROW 和 MYCOL:
所有值都是负数。最重要的是,RANK 1 上的 CONTEXT 为负数,表明此 RANK 不参与我们的 1x1 处理器网格。现在调用 descinit_ 立即成为所有处理器的问题。如果我们从 descinit_ 引用 Fortran 代码,我们有(为了清楚起见从上面重复):
只要每个处理器都参与网格,这些限制就有意义。索引不能为负数或大于或等于进程网格中的总行数或列数,因为这样的网格块不存在!
然后在 RANK 1 上,IRSRC 作为零传递,但 NPROW 和 NPCOL 从网格初始化返回为 -1,因此 descinit_ 将始终失败。
通过简单地将矩阵描述符的初始化和所有后续操作限制为参与当前网格的处理器,可以轻松地克服上述所有问题。就像是:
但是,我不只有一个处理器网格,我有两个,我需要它们通过 pdgemr2d_ 函数进行通信。此函数的目的是将一个网格上的分布式矩阵 A 的子集复制到另一个网格上的分布式矩阵 B。网格不需要以任何方式相互关联,并且可以部分或完全不相交。这应该是一个微不足道的操作。例如,我想将具有上下文 CONTEXT_A 的处理器网格中的完整矩阵复制到具有上下文 CONTEXT_B 的处理器网格中。每个上下文中矩阵的描述符以 desc_A 和 desc_B 的形式给出。
这也是相当不言自明的。它必须在任一上下文具有任何网格成员的所有处理器上运行。在我的例子中,CONTEXT_A 有一个跨越 MPI 知道的所有处理器的网格,而 CONTEXT_B 是一个 1x1 单处理器网格。
pdgemr2d_ 必须提供一个上下文标识符,至少包含包含在 CONTEXT_A 和 CONTEXT_B 中的所有处理器,并且对于那些不属于 CONTEXT_A 或 CONTEXT_B 的处理器,元素 desc_A[CTXT] 或 desc_B[CTXT] 必须分别设置为 - 1 在那个处理器上。
理论上,descinit_ 可以优雅地做到这一点,因为 Cblacs_gridinit 返回的 CONTEXT 值在任何不参与该上下文网格的处理器上都是 -1。但是,由于上面详述的 NPROW 和 NPCOL 负值的限制,descinit_ 不会在任何不参与网格的处理器上生成正确的矩阵描述符。
为了进行适当的不相交网格通信,必须在参与任一上下文的所有处理器上定义这样的矩阵描述符。
显然,pdgemr2d_ 不能用这个作为一个不可克服的缺陷来编写,因为代码中的函数描述特别指出:
PDGEMR2D 将 A 的子矩阵复制到 B 的子矩阵上。A 和 B 可以有不同的分布:它们可以在不同的处理器网格上,它们可以有不同的块大小,要复制的区域的开头可以在 A 上的不同位置和 B。
非常感谢您的帮助,我知道这是一个相当专业的问题。