Я сделал новый оператор для разреженного упражнения Matrix.Это работает хорошо, но единственная проблема в том, что выходит странное значение.
Упражнение состоит в том, чтобы написать программу на C ++ для:
- Считать две матрицы разреженных квадратов, где две матрицыданы как:
n : size of matrix – matrix A
m : number of non-zero elements
row1, col1, value1
row2, col2, value2
...
rowm, colm, valuem
n : size of matrix – matrix B
m : number of non-zero elements
row1, col1, value1
row2, col2, value2
...
rowm, colm, valuem
Умножьте их без преобразования в нормальную матрицу. Преобразуйте матрицу результатов в нормальную матрицу и запишите ее как:
n : size of matrix
a11, a12, . . ., a1n
a21, a22, . . ., a2n
...
an1, an2, . . ., ann
Ввод:
4//size of matrix
5//number of non-zero elements
1,2,3
1,4,1
2,1,5
3,4,2
4,2,3
4//size of matrix
2//number of non-zero elements
2,1,5
4,3,2
Код:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
#define MaxElements 100
class MatrixElement {
public:
int row,col;
int value;
};
class SparseMatrix {
public:
int nRows,nCols,nElements;// nRow * nCols matrix
MatrixElement smArray[MaxElements];
SparseMatrix(int r, int c): nRows(r), nCols(c), nElements(0) {
//constructor
nRows=r;
nCols=c;
nElements=0;
}
int addOrMake(int r, int c){
for(int i=0; i<nRows; i++){
if(smArray[i].row==r && smArray[i].col==c){
return i;
}
}
return true;
}
void addElement(int r, int c, int v) {
//if the value is already in (r,c)
for(int i=0; i<nElements; i++){
if(smArray[i].row==r && smArray[i].col==c){
smArray[i].value += v;
return;
}
}
//else
smArray[nElements].row=r;
smArray[nElements].col=c;
smArray[nElements].value=v;
nElements++;
}
SparseMatrix operator*(const SparseMatrix &sm2){
SparseMatrix sm3(nRows, sm2.nCols);
for (int i=0; i<nElements; i++){
for (int j=0; j<nElements; j++){
if(smArray[i].col == sm2.smArray[j].row){
sm3.addElement(smArray[i].row, sm2.smArray[j].col,smArray[i].value * sm2.smArray[j].value);
sm3.print();
}
}
}
return sm3;
}
void print() {
cout<<"Sparse Matrix is " <<endl;
for(int i=0;i<nElements;i++)
cout<<smArray[i].row<<","<<smArray[i].col<<","<<smArray[i].value<<endl;
}
};
int main () {
ifstream in("matrix.inp");
if(!in.is_open()){
cout << "fail to load input." << endl;
return 0;
}
string s;
int sizeOfMatrix, numOfElements;
getline(in,s);
sizeOfMatrix = stoi(s);
getline(in,s);
numOfElements = stoi(s);
SparseMatrix sm1(sizeOfMatrix,sizeOfMatrix);
for(int i=0; i<numOfElements; i++){
getline(in,s);
sm1.addElement(stoi(s.substr(0,1)),stoi(s.substr(2,1)),stoi(s.substr(4,1)));
}
sm1.print();
getline(in,s);
sizeOfMatrix = stoi(s);
getline(in,s);
numOfElements = stoi(s);
SparseMatrix sm2(sizeOfMatrix,sizeOfMatrix);
for(int i=0; i<numOfElements; i++){
getline(in,s);
sm2.addElement(stoi(s.substr(0,1)),stoi(s.substr(2,1)),stoi(s.substr(4,1)));
}
sm2.print();
SparseMatrix sm3(sm1.nRows,sm2.nCols);
sm3 = sm1 * sm2;
sm3.print();
/*
ofstream out("test.txt");
string asd;
if (out.is_open()) {
out << "asd";
}
*/
return 0;
}
Выход (по sm3 = sm1 * sm2;
):
1,1,15
1,3,2
2,0,1280 //<-----this shouldn't be here... don't know why it comes out.
3,3,4
4,1,15