我意识到LAPACK中的ipiv参数(如在dgetrf中)不是置换向量(如matlab中的)。这是一个交换置换。
这里讨论的是:https://software.intel.com/en-us/forums/intel-math-kernel-library/topic/290955
另一个例子是:
A = [ 1 2 3; 4 5 6; 7 8 0] %matlab notation如果你跑
dgetrf_ (&m, &n, A, &lda, ipiv, &info); // C/C++ code您所拥有的逆置换是:
ipiv = [ 3 3 3]如果要将其显示为matlab逆置换,则为:[3 1 2]。
我的问题是:是否有任何(内部)代码/算法将ipiv更改为置换?我用C.While BLAS编写的代码是常用的,我想可能有人会有这样的代码。我的矩阵可以非常大,我想要好的解决方案的时间和内存。
注意:一个明显的解决方案是在p = [1:3]迭代中初始化向量n和交换。(即第一元素与第三元素互换,第二元素与第三元素互换,第三元素与第三元素互换)
发布于 2017-07-29 19:02:13
我用C实现了它,我认为有一段人们可能需要的代码是很好的:
for (int i = 0; i < m; i++) tmpPinv[i] = i;
for (int i = 0; i < n; i++){
int tmp;
// swap (tmpPinv [ipiv [i]], tmpPinv[i] ) and it is off by one
tmp = tmpPinv [ipiv [i]-1];
tmpPinv [ipiv [i]-1] = tmpPinv [i];
tmpPinv [i] = tmp;
}它不是内部的,而且是连续的;我可能需要实现LU分解myself.So,我不会花费太多的精力来修复这个问题。
https://stackoverflow.com/questions/45122804
复制相似问题