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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...