有没有一种算法可以将 LAPACK 排列更改为真正的排列?

Is there an algorithm that changes LAPACK permutation to a real permutation?

本文关键字:排列 LAPACK 一种 算法 有没有      更新时间:2023-10-16

我意识到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编写代码,虽然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 分解。所以我不会花很多精力来解决这个问题。