Matlab cusp::io::write_matrix_market_file()提供访问冲突异常

Matlab cusp::io::write_matrix_market_file()提供访问冲突异常,matlab,matrix,cuda,cusp-library,Matlab,Matrix,Cuda,Cusp Library,我试图使用CUSP将Matlab中的272 x 544双矩阵读入ELLPACK格式的稀疏矩阵。到目前为止,我能找到的唯一方法是将数据读入mxArray,将mxArray读入double*数组(使用mxGetPr()),然后将值复制到cusp::array2d中。在那里,我需要将array2d写入一个.mtx文件,然后将该文件读入coo_矩阵,最后将其转换为ellu矩阵。即使对我来说,这听起来也很愚蠢,但考虑到CUSP的一点文档,这是我能想到的最好的了。如果有人推荐更好的方法,我会非常感激 无论如

我试图使用CUSP将Matlab中的272 x 544双矩阵读入ELLPACK格式的稀疏矩阵。到目前为止,我能找到的唯一方法是将数据读入mxArray,将mxArray读入double*数组(使用mxGetPr()),然后将值复制到cusp::array2d中。在那里,我需要将array2d写入一个.mtx文件,然后将该文件读入coo_矩阵,最后将其转换为ellu矩阵。即使对我来说,这听起来也很愚蠢,但考虑到CUSP的一点文档,这是我能想到的最好的了。如果有人推荐更好的方法,我会非常感激

无论如何,我现在面临的问题是,在我读取array2d中的数据并尝试使用cusp::write_matrix_market_file()将其写入.mtx文件后,我收到一条“未处理的异常:写入位置的访问冲突”错误消息。在我尝试将array2d中的一些值写入文件之前,我尝试打印这些值,只是为了确保所有内容都已准备就绪,并且这些值在array2d中似乎存储良好。我还尝试将类型更改为float,但错误仍然存在。 以下是我执行此任务的代码:

     #include <thrust/version.h>
     #include <cusp/version.h>
     #include <cusp/ell_matrix.h>
     #include <cusp/print.h>
     #include <cusp/io/matrix_market.h>
     #include <cusp/array2d.h>
     #include <cusp/coo_matrix.h>

     int main(int argc, char** argv)
     {
      const mxArray* mx_g_tra;
      //Reading data from Matlab   
       mx_g_tra = openMatFile2("C:\\out.mat", ndir, "out.tra");
   double* g_tra = mxGetPr(mx_g_tra);
   sizeG_tra=(int)mxGetNumberOfElements(mx_g_tra);
   const mwSize* traDims= mxGetDimensions(mx_g_tra);

      //get matrix dimensions
       tra_W= traDims[0];
   tra_H= traDims[1];
   printf("\nAcquired %d TRA elements as %d x %d from Maltab.\n", sizeG_tra, tra_W, tra_H);
       cusp::array2d<float, cusp::host_memory> TRA(traDims[0], traDims[1]);
       if(g_tra != NULL)
       {
       for(int i=0; i< traDims[0]; i++)
        {
         for(int j=0; j<traDims[1]; j++) 
          {TRA(i,j) = (float)g_tra[i*traDims[1]+j];
           if(TRA(i,j) != 0) printf("\nTRA(%d, %d) = %g", i, j, TRA(i,j));}
        }
       }

 cusp::io::write_matrix_market_file(TRA, "C:\\TRA.mtx"); 
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
常量mxArray*mx_g_tra;
//从Matlab读取数据
mx_g_tra=openMatFile2(“C:\\out.mat”,ndir,“out.tra”);
double*g_tra=mxGetPr(mx_g_tra);
sizeG_tra=(int)mxGetNumberOfElements(mx_g_tra);
常量mwSize*traDims=mxGetDimensions(mx_g_tra);
//获取矩阵维数
tra_W=traDims[0];
tra_H=traDims[1];
printf(“\n需要%d个TRA元素作为%d x%d从Maltab处获得。\n”,尺寸,TRAW,TRAH);
尖端:array2d TRA(traDims[0],traDims[1]);
如果(g_tra!=NULL)
{
for(int i=0;i(std::basic_of stream>&输出={…},常量float&值=)行116+0x5字节C++

编辑: 快速更新:我通过修改文件“matrix_market.inl”来消除异常。他们有一个奇怪的嵌套循环,通过在matrix cols上循环然后再次循环cols(从未考虑num_rows)将值写入文件。显然,由于我的矩阵不是正方形,代码试图访问不存在的位置。下面是修改后的代码:

      for(size_t j = 0; j < mtx.num_cols; j++)
       {
    // Modified below: mtx.num_cols --> mtx.num_rows
         for(size_t i = 0; i < mtx.num_rows; i++)
         {
         write_value(output, mtx(i,j));
         output << "\n";
          }
         }
(大小j=0;j { //修改如下:mtx.num\u列-->mtx.num\u行 对于(大小i=0;i输出这段代码对我很有用,演示了如何直接从array2d转到coo或ell:

编辑:更新了代码示例,以显示
cusp::is\u valid\u matrix()的用法。

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
//初始矩阵
尖点:Array2de(4,3);
E(0,0)=1.000e+00;E(0,1)=0.000e+00;E(0,2)=0.000e+00;
E(1,0)=0.000e+00;E(1,1)=1.050e+01;E(1,2)=0.000e+00;
E(2,0)=0.000e+00;E(2,1)=0.000e+00;E(2,2)=2.500e-01;
E(3,0)=0.000e+00;E(3,1)=2.505e+02;E(3,2)=0.000e+00;
尖点:coo_矩阵coo(E);
尖点:厄尔矩阵厄尔(E);
如果(!cusp::is_valid_matrix(coo)){printf(“无效coo\n”);返回1;}
如果(!cusp::is_valid_matrix(ell)){printf(“Invalid ell\n”);返回1;}
cusp::io::编写矩阵和市场文件(coo,“coo.mtx”);
cusp::io::编写矩阵和市场文件(ell,“ell.mtx”);
返回0;
}

这段代码对我很有用,演示了如何直接从array2d转到coo或ell:

编辑:更新了代码示例,以显示
cusp::is\u valid\u matrix()的用法。

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
//初始矩阵
尖点:Array2de(4,3);
E(0,0)=1.000e+00;E(0,1)=0.000e+00;E(0,2)=0.000e+00;
E(1,0)=0.000e+00;E(1,1)=1.050e+01;E(1,2)=0.000e+00;
E(2,0)=0.000e+00;E(2,1)=0.000e+00;E(2,2)=2.500e-01;
E(3,0)=0.000e+00;E(3,1)=2.505e+02;E(3,2)=0.000e+00;
尖点:coo_矩阵coo(E);
尖点:厄尔矩阵厄尔(E);
如果(!cusp::is_valid_matrix(coo)){printf(“无效coo\n”);返回1;}
如果(!cusp::is_valid_matrix(ell)){printf(“Invalid ell\n”);返回1;}
cusp::io::编写矩阵和市场文件(coo,“coo.mtx”);
cusp::io::编写矩阵和市场文件(ell,“ell.mtx”);
返回0;
}

只要行数大于列数,代码就没有例外,也没有问题。我遇到的问题是行数是列数的一半。所以当在文件“matrix\u market.inl”中写入值时假设我的矩阵是一个平方矩阵,并且在两个循环中只考虑num_cols,我得到了错误。事实上,引发异常时I的值是273(我的272 x 544矩阵中不存在的第一行)。 我通过在“matrix\u market.inl”代码中编辑write\u matrix\u market\u流修复了它,如下所示:

       template <typename Matrix, typename Stream>
       void write_matrix_market_stream(const Matrix& mtx, Stream& output, cusp::array2d_format)
       {
        typedef typename Matrix::value_type ValueType;

        bool is_complex = thrust::detail::is_same<ValueType, cusp::complex<typename                   norm_type<ValueType>::type> >::value;

        if (is_complex)
        output << "%%MatrixMarket matrix array complex general\n";
        else
        output << "%%MatrixMarket matrix array real general\n";

        output << "\t" << mtx.num_rows << "\t" << mtx.num_cols << "\n";

        for(size_t j = 0; j < mtx.num_cols; j++)
        {
         // EDIT needed here
     // Modified below: mtx.num_cols --> mtx.num_rows
        for(size_t i = 0; i < mtx.num_rows; i++)
          {
             write_value(output, mtx(i,j));
            output << "\n";
          }
        }
        }
模板
无效写入矩阵市场流(常量矩阵和mtx、流和输出、cusp::array2d格式)
{
typedef typename矩阵::value_type ValueType;
bool is_complex=推力::细节::is_same::值;
如果(是复杂的)

输出只要行数大于列数,代码就没有异常,也没有问题。我遇到的问题是行数是列数的一半。所以当在文件“matrix\u market.inl”中写入值时假设我的矩阵是一个平方矩阵,并且在两个循环中只考虑num_cols,我得到了错误。事实上,引发异常时I的值是273(我的272 x 544矩阵中不存在的第一行)。 我通过在“matrix\u market.inl”代码中编辑write\u matrix\u market\u流修复了它,如下所示:

       template <typename Matrix, typename Stream>
       void write_matrix_market_stream(const Matrix& mtx, Stream& output, cusp::array2d_format)
       {
        typedef typename Matrix::value_type ValueType;

        bool is_complex = thrust::detail::is_same<ValueType, cusp::complex<typename                   norm_type<ValueType>::type> >::value;

        if (is_complex)
        output << "%%MatrixMarket matrix array complex general\n";
        else
        output << "%%MatrixMarket matrix array real general\n";

        output << "\t" << mtx.num_rows << "\t" << mtx.num_cols << "\n";

        for(size_t j = 0; j < mtx.num_cols; j++)
        {
         // EDIT needed here
     // Modified below: mtx.num_cols --> mtx.num_rows
        for(size_t i = 0; i < mtx.num_rows; i++)
          {
             write_value(output, mtx(i,j));
            output << "\n";
          }
        }
        }
模板
无效写入矩阵市场_