2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 CSR метод хранения разреженных матриц
Сообщение06.03.2011, 21:40 
Нужна ваша помощь. Необходимо реализовать CSR метод хранения симметричных разреженных матриц
Матрица считывается из файла matr, который выглядит следующим образом
7
9.0 0.0 0.0 3.0 1.0 0.0 1.0
0.0 11.0 2.0 1.0 0.0 0.0 2.0
0.0 2.0 10.0 2.0 0.0 0.0 0.0
3.0 1.0 2.0 9.0 1.0 0.0 0.0
1.0 0.0 0.0 1.0 12.0 0.0 1.0
0.0 0.0 0.0 0.0 0.0 8.0 0.0
1.0 2.0 0.0 0.0 1.0 0.0 8.0
где в 1ой строке указан размер матрицы
В результате должны получиться следующие 3 массива
AN: 9.0 3.0 1.0 1.0 11.0 2.0 1.0 2.0 10.0 2.0 9.0 1.0 12.0 1.0 8.0 8.0
JA: 0.0 3.0 4.0 6.0 1.0 2.0 3.0 6.0 2.0 3.0 3.0 4.0 4.0 6.0 5.0 6.0
IA: 0.0 4.0 8.0 10.0 12.0 14.0 15.0 16.0
Т.к матрица симметрична, то всю матрицу не нужно хранить, нужно только верхнюю треугольную построчно с диагональными элементами
Код:
#include "stdafx.h"
#include <iostream>
using namespace std;

int main(int argc, char **argv)

{int a;
int N=0;
int i,j,col=0;
float JA[100],IA[100];
float A[100][100];

FILE *file_f1=fopen("matr.txt", "rt");if (!file_f1) {cout << "No file"<<"\n";}
//файл чтения
fscanf(file_f1,"%d",&N);
cout<<N<<"\n"<< endl;
   for(int i=0;i<N;i++)
    { for(int j=0;j<N;j++)
      {
       fscanf(file_f1,"%f",&A[i][j]);
      if ((A[i][j]!=0) && (i<=j))
      {   JA[j]=j;
           cout<<"JA    "<<JA[j]<<"\n"<< endl;
          col+=1;
            cout<<"AN   "<<A[i][j]<<"\n"<< endl;

      }   
      }
    }
cout<<"col  "<<col<<"\n"<< endl;

cin >> a;
fclose(file_f1);
   
cout << "Done..." << endl;


массивы AN и JA ищутся правильно. Как сформировать массив IA(номер, с которого в AN начинается новая строка?

 
 
 
 Re: CSR метод хранения разреженных матриц
Сообщение07.03.2011, 13:19 
может кому-то пригодится.Полностью рабочий вариант
Код:
int _tmain(int argc, _TCHAR* argv[])
{   
int a;
int N=0;
int i,j,col=0,num=0;
int JA[100],IA[100];
float A[100][100];
float AN[100];

FILE *file_f1=fopen("matr.txt", "rt");if (!file_f1) {cout << "No file"<<"\n";}
//файл чтения
fscanf(file_f1,"%d",&N);
//cout<<N<<"\n"<< endl;
   for(int i=0;i<N;i++)
    { for(int j=0;j<N;j++)
      {
       fscanf(file_f1,"%f",&A[i][j]);
      if ((A[i][j]!=0) && (i<=j))
      {   JA[j]=j;
          //cout<<"JA    "<<JA[j]<<"\n"<< endl;
          col+=1;
         AN[j]=A[i][j];
           //cout<<"AN   "<<AN[j]<<"\n"<< endl;
      }
     }
   IA[0]=0;
   IA[i+1]=col;
   
    }

 
 
 [ Сообщений: 2 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group