我正在尝试使用 CUSP 将 272 x 544 双矩阵从 Matlab 读取到 ELLPACK 格式的稀疏矩阵中。到目前为止,我能找到的唯一方法是将数据读入 mxArray,将 mxArray 读入 double* 数组(使用 mxGetPr()),然后将值复制到 cusp::array2d 中。在那里,我需要将 array2d 写入 .mtx 文件,然后将文件读入 coo_matrix,最后将其转换为 ell_matrix。对我来说这听起来很傻,但鉴于 CUSP 的文档很少,这是我能想到的最好的。如果有人推荐一种更好的方法,我将非常感激。
无论如何,我现在面临的问题是,在我读取 array2d 中的数据并尝试使用 cusp::write_matrix_market_file() 将其写入 .mtx 文件后,我收到“未处理的异常:写入位置的访问冲突”错误消息. 在尝试将它们写入文件之前,我尝试从 array2d 打印一些值,只是为了确保一切都到位并且这些值似乎存储在 array2d 中。我也尝试将类型更改为浮动,但错误仍然存在。这是我执行此任务的代码:
#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");
在我得到异常时,调用堆栈指向: cusp::io::detail::write_value >,float>(std::basic_ofstream > & output={...}, const float & value=) 行116 + 0x5 字节 C++
编辑:快速更新:我通过修改文件“matrix_market.inl”摆脱了异常,他们有一个奇怪的嵌套循环,通过遍历矩阵 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";
}
}
我不确定从这个 .mtx 文件读取时这会如何影响不同的格式构造函数