如何解决mkl:无效值错误求和稀疏矩阵
以下程序使用Intel MKL并根据坐标表示创建稀疏矩阵,然后将该矩阵导出到CSR format。
include 'mkl_spblas.f90'
program test
use iso_c_binding
use mkl_spblas
implicit none
complex(kind=kind(0.d0)) :: values(4)
integer :: columns(4)
integer :: rows(4)
TYPE(C_PTR) :: rows_start_csr,rows_end_csr,col_index_csr,values_csr
integer(C_INT) :: indexing_csr,nrows_csr,ncol_csr
type(SPARSE_MATRIX_T) :: handle
integer :: stat
! Matrix
!
! | 0 1 0 0 |
! | 1 0 0 0 |
! | 0 0 1 0 |
! | 0 0 0 1 |
values(1) = 1
rows(1) = 1
columns(1) = 2
values(2) = 1
rows(2) = 2
columns(2) = 1
values(3) = 1
rows(3) = 3
columns(3) = 3
values(4) = 1
rows(4) = 4
columns(4) = 4
stat = mkl_sparse_z_create_coo(handle,SPARSE_INDEX_BASE_ONE,4,rows,columns,values)
write (*,*) 'stat after create = ',stat
stat = mkl_sparse_z_export_csr(handle,indexing_csr,ncol_csr,rows_start_csr,values_csr)
write (*,*) 'stat after export = ',stat,' SPARSE_STATUS_INVALID_VALUE = ',SPARSE_STATUS_INVALID_VALUE
end program test
程序的输出为:
stat after create = 0
stat after export = 3 SPARSE_STATUS_INVALID_VALUE = 3
创建矩阵后,状态为OK,但令人惊讶的是,导出矩阵后的状态对应于SPARSE_STATUS_INVALID_VALUE
。
这怎么可能发生,以及如何解决?
解决方法
您需要预先将COO格式转换为CSR。
include 'mkl_spblas.f90'
program test
use iso_c_binding
use mkl_spblas
implicit none
complex(kind=kind(0.d0)) :: values(4)
integer :: columns(4)
integer :: rows(4)
TYPE(C_PTR) :: rows_start_csr,rows_end_csr,col_index_csr,values_csr
integer(C_INT) :: indexing_csr,nrows_csr,ncol_csr
type(SPARSE_MATRIX_T) :: coo,csr ! ===== NEW
integer :: stat
! Matrix
!
! | 0 1 0 0 |
! | 1 0 0 0 |
! | 0 0 1 0 |
! | 0 0 0 1 |
values(1) = 1
rows(1) = 1
columns(1) = 2
values(2) = 1
rows(2) = 2
columns(2) = 1
values(3) = 1
rows(3) = 3
columns(3) = 3
values(4) = 1
rows(4) = 4
columns(4) = 4
stat = mkl_sparse_z_create_coo(coo,SPARSE_INDEX_BASE_ONE,4,rows,columns,values)
write (*,*) 'stat after create = ',stat
! ===== NEW ===== ->
stat = mkl_sparse_convert_csr(coo,SPARSE_OPERATION_NON_TRANSPOSE,csr)
write (*,*) 'stat after convert = ',stat
! ===== NEW ===== <-
stat = mkl_sparse_z_export_csr(csr,indexing_csr,ncol_csr,rows_start_csr,values_csr)
write (*,*) 'stat after export = ',stat,' SPARSE_STATUS_INVALID_VALUE = ',SPARSE_STATUS_INVALID_VALUE
end program
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。