0
我必須編寫一個返回逆矩陣的Fortran例程。如果我在Fortran程序中運行下面的代碼,逆矩陣是正確的,但是當我從C++代碼運行子例程時,我的第一個值是錯誤的值。這似乎是數據類型或內存的問題。Fortran子程序在C++程序中調用時發送錯誤的結果
我在做什麼錯?
這裏是子程序:
subroutine get_inverse_matrix(matrix, rows_matrix, cols_matrix, tmpMatrix, rows_tmpMatrix, cols_tmpMatrix) bind(c)
use iso_c_binding
integer :: m, n, lda, lwork, info, size_m
integer(c_int) :: rows_matrix, cols_matrix, rows_tmpMatrix, cols_tmpMatrix
real(c_double) :: matrix(rows_matrix, cols_matrix), tmpMatrix(rows_tmpMatrix, cols_tmpMatrix)
integer, dimension(rows_matrix) :: ipiv
real, dimension(rows_matrix) :: work
size_m = rows_matrix
m = size_m
n = size_m
lda = size_m
lwork = size_m
write(*,*) "Matrix: ", matrix
!tmpMatrix = matrix
write(*,*) "Temp matrix: ", tmpMatrix
! LU-Faktorisierung (Dreieckszerlegung) der Matrix
call sgetrf(m, n, tmpMatrix, lda, ipiv, info)
write(*,*) info
! Inverse der LU-faktorisierten Matrix
call sgetri(n, tmpMatrix, lda, ipiv, work, lwork, info)
write(*,*) info
select case(info)
case(0)
write(*,*) "SUCCESS"
case(:-1)
write(*,*) "ILLEGAL VALUE"
case(1:)
write(*,*) "SINGULAR MATRIX"
end select
end subroutine get_inverse_matrix
這是在C++代碼的聲明:
extern "C"
{
void get_inverse_matrix(double *matrix, int *rows_matrix, int *cols_matrix, double *tmpMatrix, int *rows_tmpMatrix, int *cols_tmpMatrix);}
這裏是我的C++程序中調用:
get_inverse_matrix(&lhs[0], &sz, &sz, &res[0], &sz, &sz);
我的程序僅使用3x3矩陣。如果我通過單位矩陣的結果是這樣的:
5.29981e-315 0 0
0 1 0
0 0 1
您正在傳遞一個聲明爲'c_double'類型的數組來拉包裝例程,這些例程需要單精度,這有時會導致問題。你可以嘗試用'dgetrf'和'dgetri'替換'sgetrf'和'sgetri',這有幫助嗎?在這種情況下,我不會期望fortran能夠工作。注意你可能也應該在C++代碼中顯示聲明。 –
我在C++代碼中添加了聲明。另外,我替換爲你所稱的,但結果是一個只有零的矩陣,不管我嘗試了什麼值。 – fx88
將現代Fortran90 +接口模塊用於LAPACK或至少有一個接口模塊來檢查呼叫錯誤是更好的方法。 –