0
我意識到在LAPACK中的參數ipiv
(如dgetrf
)不是置換矢量(就像在matlab中一樣)。這是一個交換置換。是否有算法將LAPACK置換變爲真實的置換?
在此討論: 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
迭代。 (對於第三即交換第1個要素,交換與第3第2元,更換爲可三度三元素)
我們不是一個編碼服務。並且算法是語言不可知的。 – Olaf
查看LAPACK的[dgetri()](http://www.netlib.org/lapack/explore-html/df/da4/dgetri_8f_source.html)的第247-254行,在這裏執行交換。它正如你在筆記中所描述的那樣完成。明顯的解決方案似乎是很好的解決方案,可能是因爲計算矩陣的PLU分解要比應用該方法複雜得多。如果你想交換矩陣的行,'memcpy()'和一個行的大小的緩衝區可能比j更有效率;溫度= A [1 * N + D]; A [1 * N + J =α[IB * N + D];一個[IB * N + D] =溫度; – francis
在你的例子中,正確的排列順序是[3,1,2] – percusse