是否有一种算法可以将 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 我不会花很多精力来解决这个问题。