有没有一种算法可以将 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]
我的问题是:是否有任何(就地(代码/算法可以将 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 分解。所以我不会花很多精力来解决这个问题。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 直接在RcppArmadillo中调用LAPACK例程
- 重新排列单线以形成闭合多边形?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 输入的 C++ 排列
- 公共/私有/受保护是否会更改内存中结构的排列?
- 如何在 C/C++ 中生成具有 n 组 5 个值(重复项)的所有可能排列的矩阵
- 在向量C++中排列奇数和偶数
- 如何进行排列?
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 在 CPP 中打印具有重复项的选定长度字符的所有排列
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 调用参数排列不变函数 f(i++, i++)
- 以 C++ 为单位具有输出限制的排列
- 在C++中寻找排列和组合
- 有没有一种算法可以将 LAPACK 排列更改为真正的排列?