Странное значение выходит из моего матричного оператора - PullRequest
1 голос
/ 28 сентября 2019

Я сделал новый оператор для разреженного упражнения Matrix.Это работает хорошо, но единственная проблема в том, что выходит странное значение.

Упражнение состоит в том, чтобы написать программу на C ++ для:

  1. Считать две матрицы разреженных квадратов, где две матрицыданы как:
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...