У меня есть два типа кодов:
этот, я могу извлечь все символы из файла 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++ не анализирует так же, как английский.