我目前正在开发一个处理水中化学添加物的iOS应用。为了找到最小的可能加法,我求解Ax = B,其中A是6x6矩阵,B是一列。据我所读,加速框架中的LAPACK是处理此问题的最佳方法。我已经能够使用DGESV_使它适用于少量添加,但是较大的添加对于x具有负值。这是一个问题,因为您不能添加负量的化学药品。
所以我需要知道的是,LAPACK中是否有一个函数可以让我找到Ax = B的最小解,其中x始终大于或等于0?如果不是,是否有替代解决方案(除了自己做数学之外)?
谢谢
我的目标是使用LAPACK和Emscripten.Emscripten能够将C代码转换为JavaScript.但遗憾的是,LAPACK 3.5.0(http://www.netlib.org/lapack/)仅适用于FORTRAN95.
CLAPACK项目(http://www.netlib.org/clapack/)基本上就是我想要的:LAPACK的C版本.但是这个已经过时了; 最新的是3.2.1.
所以现在我的问题是:为什么没有更新的LAPACK端口到C?有什么建议如何实现我的目标?
提前致谢!
我设法将LAPACK,LAPACK C-wrapper移植到javascript.然而,我无法使用它,因为包装器使用内部FORTRAN例程.我如何在emscripten中嵌入这些内容?
例如,函数LAPACKE_cgbcon使用仅在FORTRAN中可用的LAPACKE_xerbla.为什么我会从移植包装器中受益?
我正在比较 C++ 和 Python 计算的数值结果。在 C++ 中,我使用 LAPACK 的 sgels 函数来计算线性回归问题的系数。在 Python 中,我使用 Numpy 的 linalg.lstsq 函数来完成类似的任务。
sgels 和 linalg.lstsq 使用的方法之间的数学差异是什么?
以数字方式比较结果(即回归系数)时的预期误差(例如 6 位有效数字)是多少?
仅供参考:我绝不是 C++ 或 Python 专家,因此很难理解函数内部发生了什么。
我想将矩阵乘以 D*W',其中 W' 是 W 的转置版本。
虽然我将使用 DGEMM,但我在 @IanBush 的帮助下发现,这种情况下的 LDB 应该是矩阵 W 的行数而不是列数。本例的代码是
Call dgemm('n', 't', N1, M1, N1, 1.0_wp, D, N1, W, M1, 0.0_wp, c, n1)
Run Code Online (Sandbox Code Playgroud)
其中 n1 和 m1 是我的矩阵的维度
Dimensions of the matrices:
W = M1*N1
D = N1*N1
Run Code Online (Sandbox Code Playgroud)
正如官方文档中所说
LDB is INTEGER
On entry, LDB specifies the first dimension of B as declared
in the calling (sub) program. When TRANSB = 'N' or 'n' then
LDB must be at least max( 1, k ), otherwise …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我需要执行很多规范,点积,最重要的是矩阵向量乘法.
矩阵和向量是巨大的.矩阵维度趋于100000x100000
循环结构是:
while(condition)
/* usually iterations=dimension of matrix, so around 1 million iterations are *at least* required (if not more) */
matrix-vector multiplication
3 dot prods
2 norms
Run Code Online (Sandbox Code Playgroud)
我目前正在使用Intel Fortran和Intel MKL.用英特尔MKL重写英特尔C中的代码会有帮助吗?有没有人进行过任何形式的基准测试(尤其是DGEMV)?重写代码是一个很大的痛苦,但如果我有理由,我不会介意重写.
编辑:我错过了:矩阵尺寸是100000而不是一百万.相当严重的错误:|
是的,矩阵是密集的,它需要密集.而且,它不是对称的,甚至不是正定的.我的算法是QMR的修改版本.
我想从中下载可以在我的C程序中使用的LAPACK和BLAS库的说明/网站。我也想知道如何从终端将它们链接到gcc编译器。
我是使用 LAPACK/BLAS 的新手。我想计算一个方程的解:
AU=F
我想知道这部分代码的逻辑错误是什么。我使用求解器输入大小为 ((xdiv-1) (ydiv-1),(xdiv-1) (ydiv-1)) 的矩阵 A。然后,随后求解方程。U=逆(A)* f。
其中 U 和 f 大小相同。(u((xdiv-1) (ydiv-1),1),f((xdiv-1) (ydiv-1),1))。执行矩阵求逆时出现分段错误错误。
这是我的代码:
program main
double precision, allocatable :: A(:,:)
double precision, allocatable :: u(:,:), f(:,:)
double precision mesh(2), dx, dy
integer xdiv, ydiv
xdiv=55
ydiv=55
mesh(1)=.001
mesh(2)=.001
dx=mesh(1)
dy=mesh(2)
allocate (A((xdiv-1)*(ydiv-1),(xdiv-1)*(ydiv-1)))
allocate (Ainv((xdiv-1)*(ydiv-1),(xdiv-1)*(ydiv-1)))
allocate (u((xdiv-1)*(ydiv-1),1),f((xdiv-1)*(ydiv-1),1))
do i =1,(xdiv-1)*(ydiv-1)
A(i,i)=-2.d0*(1.d0/(dx**2)+1.d0/(dy**2))
enddo
do i=1,(xdiv-2)
do j=1,(ydiv-1)
A(i+(j-1)*(xdiv-1),i+(j-1)*(xdiv-1)+1)=1.d0/(dx**2)
A(i+(j-1)*(xdiv-1)+1,i+(j-1)*(xdiv-1))=1.d0/(dx**2)
enddo
enddo
do i=1,(xdiv-1)
do j=1,(ydiv-2)
A(i+(j-1)*(xdiv-1),i+(j)*(xdiv-1))=1.d0/(dy**2)
A(i+(j)*(xdiv-1),i+(j-1)*(xdiv))=1.d0/(dy**2)
enddo
enddo
do i=1,(xdiv-1)
do j=1,(ydiv-1)
xcoord = (i-1)*mesh(1) …Run Code Online (Sandbox Code Playgroud)