2017-07-15 158 views
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元,更換爲可三度三元素)

+0

我們不是一個編碼服務。並且算法是語言不可知的。 – Olaf

+1

查看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

+1

在你的例子中,正確的排列順序是[3,1,2] – percusse

回答

0

我實現它在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分解。因此,我不會付出很多努力來解決這個問題。

相關問題