У меня есть файл матрицы mtx, пока не разберусь:

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

этот, я могу извлечь все символы из файла 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 1 2 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 х 9 Записей: 50 Разреженный: правда Тип: шаблон общий Норма Фробениуса: -

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

вывод для матрицы sparse03 таков: Имя файла: sparse03.mtx Размеры: 5 х 5 Записи: 10 Разреженный: правда Тип: настоящий генерал Норма Фробениуса: 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] в качестве входной ссылки

Ну if ( line[0]&&line[1] == '%' ) должно быть if (line[0] == '%' && line[1] == '%' ) C++ не анализирует так же, как английский.

john 08.03.2019 11:44

хорошо, спасибо, теперь следующий шаг...

user11169871 08.03.2019 12:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
78
0

Другие вопросы по теме