Come potrei testare la mia classe Matrix?

0

Attualmente sto lavorando nella mia classe matrix. Dopo il completamento della matrice sto pianificando di scrivere un test unitario per questa classe di matrice testando tutte le funzioni che ho scritto.

class Matrix{
    Matrix(size_t, size_t);
    Matrix transpose();
    Matrix operator+(const Matrix&)const;
    ...

private:
    std::vector<std::vector<double>> matrix;
};

Come posso testare?

Attualmente sto pianificando di non utilizzare alcuna libreria esterna e di utilizzare il mio metodo di test.

void test_transpose(){
    matrix a = {...some value..}; // nxm

    // I calculate the expected value via matlab
    matrix expected = {...some value..}; // mxn
    matrix b = a.transpose();

    assert(expected == b);
}

void test_xxxxx1(){

    ....
} 

int main(){

    test_transpose();  
    test_xxxxx1();
    test_xxxxx2();
    ...
    return 0;
}

Qualcuno può darmi dei consigli se il metodo che sto seguendo è corretto o esiste un metodo migliore che dovrei seguire?

    
posta pokche 28.10.2016 - 04:00
fonte

2 risposte

2

Quindi so che hai detto che non hai intenzione di usare una libreria esterna, ma questo è quello che ho fatto in situazioni simili con grande successo:

1) Genera milioni di problemi matematici a matrice casuale e salvali in un file. Assicurati di coprire ogni caso limite che ti viene in mente durante la generazione di matrici.

2) Ottieni le risposte usando Matlab o Octave e salvale in un altro file.

3) Verifica il tuo codice leggendo entrambi i file e verificando che ottieni le stesse risposte.

Non stai utilizzando una libreria esterna nel tuo codice perché stai creando una serie di casi di test con le risposte per verificare il tuo codice.

    
risposta data 28.10.2016 - 05:23
fonte
0

Dipenderà un po 'da quali funzioni di matrice si intende implementare, quindi alcuni test che vorrei suggerire:

  • Trasponi - potrebbe essere fatto in tempo O (1).
  • Moltiplicazioni: gli overflow sono facili, controlla con numeri grandi.
  • Inversione - mischia alcuni 0 e osserva che l'eliminazione gaussiana va molto male.

Alcune matrici sono molto più difficili da utilizzare numericamente, ma hanno soluzioni analitiche o soluzioni numeriche per casi particolari. La matrice Vandermonde è qualcosa con cui mi sono divertito molto. Oppure prova a invertire una matrice tridiagonale in cui ogni riga successiva è 10 volte la riga precedente. Questo dovrebbe avere un rapporto di condizioni molto elevato.

Controllando anche alcune identità di matrice di base come A (B + C) = AB + AC.

    
risposta data 02.11.2016 - 01:56
fonte

Leggi altre domande sui tag