у меня есть матричный файл MTX, пока не разобраться: - PullRequest
0 голосов
/ 08 марта 2019

У меня есть два типа кодов:

этот, я могу извлечь все символы из файла MTX, но когда я запускаю его, я не могу получить последние два слова первой строки, яя не могу пропустить строки с символами '%' и пустыми строками, и я не могу разделить размеры матрицы и их значения в их собственный набор массивов.Кроме того, первая строка с числами - это целые числа, которые подсчитывают числа измерений и записей, и я хочу создать цикл for, который подсчитывает входы и разделяет значения в его собственном массиве, чтобы я мог вычислить их frobinius_norm в научной нотации.

#include <iostream>
#include <cmath>
#include <vector>
#include <fstream>
#include <string>
#include <iomanip>
#include <sstream>
using namespace std;

void processLine(const string &line)
{
    string first, second, third;
    if ( line[0]&&line[1] == '%' )
    {
        //extract last 2 words
        cout <<line << endl;
    } else if (line[0]=='%')
    {
       //ignore the lines
        cout << line << endl;
    } else {
        /*seperate matrix dimensions and values,
        but the first one is x*y dimension and number of entries*/
        cout << line << endl;
}
}

void processFile(const char *filename)
{
    ifstream inf(filename);
    if ( inf.is_open() ) {
        string line,type;
        while ( getline(inf,line) ) {
       processLine(line);
    }
    } else {
        cout << "Sorry, but the file don't exist!\n";
    }
}

int main(int argc, char *argv[])
{
    if (argc==2){
    cout <<"Filename: " << argv[1] << endl;
        processFile(argv[1]);
} else {
    cout << "give a filename\n";
}
}

и вот это, я могу успешно извлечь всю информацию из первого файла матрицы: sparse01.mtx :

%% MatrixMarket матричный шаблон координат общая 9 9 50 1 12 1 4 1 5 1 6 1 7 1 8 1 9 1 2 2 3 2 ... 9 9

но матрица sparse02.mtx и sparse03.mtx Я не могу изменить код, чтобы дать мне правильныйрезультат, потому что я не могу игнорировать строки с начальным символом '%' и пустыми строками.Я не могу действительно подсчитать входы и разделить измерения и значения, и из-за этого я не могу вычислить норму фробиниуса ...

int main(int argc, char *argv[])
{
    string filename, line, type1, type2, header;
    int x, y, entry, count=0;
    double element;
    char norm;
    float frobenius_norm;
    ifstream openfile;

    filename = argv[1];
    openfile.open(argv[1]);

    if(!openfile.is_open())
    {
        cout << "Sorry, but the file don't exist!\n";
        exit(1);
    }

    for(int i =0;i<2;i++)
    {
        getline(openfile,line,' ');
    }

    getline(openfile,header,' ');
    getline(openfile,type1,' ');
    getline(openfile,type2);
    if(getline(openfile,line).peek()=='%'){
        cout << "lol"<<endl;
    }
    openfile >> x >> y >> entry;



    cout <<"Filename: " << filename << endl;
    cout <<"Dimensions: " << x << " x " << y << endl;
    cout <<"Entries: " << entry <<endl;

    if(header == "coordinate")
    {
        cout <<"Sparse: "<< "true" <<endl;
    }
    else if ((x*y/2)<entry||header == "array")
    {
     cout <<"Sparse: "<< "false" <<endl;
    }

    cout <<"Type: "<< type1 << ' ' << type2 <<endl;

    if(type1 == "pattern"){
        norm = '-';
        cout <<"Frobenius norm: "<< norm <<endl;
    } else {
        frobenius_norm = 100;
        cout <<"Frobenius norm: "<< frobenius_norm <<endl;
    }

    return 0;
}

результат должен быть таким:

Имя файла: sparse01.mtx Размеры: 9 x 9 Записи: 50 Разреженный: true Тип: общий шаблон норма Фробениуса: -

%% MatrixMarket общий шаблон координат матрицы 9 9 50 1 1 2 1 4 1 5 1 6 1 7 1... (усеченный) 9 9

выходные данные для матрицы sparse03 таковы: Имя файла: sparse03.mtx Размеры: 5 x 5 Записи: 10 Sparse: true Тип: действительный общий Фробениус норма: 1.2e + 02

это файл sparse03.mtx (это не код, а входной файл):

%%MatrixMarket matrix coordinate real general
%
% Hello
% How
% Are
% you
% doing
%

5  5  10
1  1  11.0
1  5  15.0  
2  3  23.0  
2  4  24.0  
3  2  32.0    
3  5  35.0   
4  1  41.0  
5  2  52.0
5  4  54.0
5  5  55.0 

Я также хочу, чтобы мой код вычислял плотную и специальную матрицу:

имейте в виду, что я использовал argv [1] в качестве входной ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...