我试图阅读并使用矩阵市场文件,但我目前的尝试还没有产生任何东西。我对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
第一行没有以%表示,表示行数,然后是列,最后是非零条目的数量(我认为) 然后,以下行索引每个条目的行和列位置及其对应的值。
答案 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');