是否有一种算法可以将 LAPACK 排列更改为真实排列?
Is there an algorithm that changes LAPACK permutation to a real permutation?
我意识到 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]
我的问题是:是否有任何(就地)code/algorithm 将 ipiv 更改为排列?我写的代码在C.While BLAS是常用的,我猜有人可能有这样的代码。我的矩阵可能非常大,我想要关于时间和内存的好的解决方案。
注意:一个明显的解决方案是初始化向量 p = [1:3]
并交换 n
迭代。 (即,将第一个元素与第三个元素交换,将第二个元素与第三个元素交换,将第三个元素与第三个元素交换)
我用 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 我不会花很多精力来解决这个问题。
我意识到 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]
我的问题是:是否有任何(就地)code/algorithm 将 ipiv 更改为排列?我写的代码在C.While BLAS是常用的,我猜有人可能有这样的代码。我的矩阵可能非常大,我想要关于时间和内存的好的解决方案。
注意:一个明显的解决方案是初始化向量 p = [1:3]
并交换 n
迭代。 (即,将第一个元素与第三个元素交换,将第二个元素与第三个元素交换,将第三个元素与第三个元素交换)
我用 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 我不会花很多精力来解决这个问题。