gpt4 book ai didi

c++ - 是否有一种算法可以将 LAPACK 排列更改为真实排列?

转载 作者:行者123 更新时间:2023-11-30 16:43:36 25 4
gpt4 key购买 nike

我意识到LAPACK中的ipiv参数(如dgetrf)不是一个排列 vector (如在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很常用,但我猜有人可能有这样的代码。我的矩阵可能非常大,我想要关于时间和内存的良好解决方案。

注意:一个明显的解决方案是初始化 vector 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分解。所以我不会花很多精力来解决这个问题。

关于c++ - 是否有一种算法可以将 LAPACK 排列更改为真实排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45122804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com