阅读Matrix Market文件C ++问题

时间:2017-10-23 00:42:31

标签: c++ sparse-matrix fstream

我试图阅读并使用矩阵市场文件,但我目前的尝试还没有产生任何东西。我对C ++非常陌生,所以要温柔。这是我到目前为止所得到的:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
ifstream f("GX30.mtx");
int m,n,l;
while(f.peek()=='%') f.ignore(2048, '\n');
f>>m>>n>>l;
cout<<l;
int I[m],J[n],val[l];
int mat[m][n];

for(int i=1;i<=l;i++)
{
    f>>I[i]>>J[i]>>val[i];

}
for(int k=1; k<=l;k++)
{
        mat[I[k]][J[k]]=val[k];
        cout<<"test";
}}

我的测试输出什么都没有产生,并且没有一个确定矩阵参数的变量正确初始化。我读取的文件中的前几行如下:

%%MatrixMarket matrix coordinate integer general
%% X {5,5} [[30,8,3]] [ (b*a^-1)^3 ]
12 30 60
1 1 1
1 3 1
1 4 1

第一行没有以%表示,表示行数,然后是列,最后是非零条目的数量(我认为) 然后,以下行索引每个条目的行和列位置及其对应的值。

1 个答案:

答案 0 :(得分:0)

您需要修复的问题很少。

主要问题是如何访问数组。数组索引从0开始,而不是1.数组大小在您的应用程序中也是不同的。

I[m],J[n],val[l];

m,n,l不相等所以你超越了两个数组的边界:

for(int i=1;i<=l;i++)
for(int k=1; k<=l;k++)

您的代码最有可能导致访问冲突和崩溃,因此您甚至看不到cout<<l;操作的结果。 你不应该像你一样从一个循环访问所有数组。如下所示是好的。

for (int i = 0; i < l; ++i)
{
   val[i] ... // val array, not I or J here
}

此外,Matrix Market允许使用浮点值,但您使用的是整数。

还有一件事:行可以用&#34; \ r&#34;,&#34; \ n&#34;和&#34; \ r \ n&#34;但你期待&#39; \ n&#39;。 Matrix Market格式是否指定了任何内容或它依赖于操作系统约定?如果使用&#39; \ r&#39;那么你的代码可能不起作用:

while(f.peek()=='%') f.ignore(2048, '\n');