Tipi di gestione per matrici reali e complesse in un wrapper BLAS

2

Vengo da uno sfondo C e ora sto imparando OOP con C ++. Come esercizio (quindi per favore non dire semplicemente "questo esiste già"), voglio implementare un wrapper per BLAS che consente all'utente di scrivere algebra di matrici in modo intuitivo (ad es. Simile a MATLAB) ad esempio:

A = B * C * D.Inverse () + E.Transpose ();

Il mio problema è come trattare le matrici reali (R) e complesse (C), a causa della "maledizione" del C ++ che consente di fare la stessa cosa in N modi diversi.

I do hanno una chiara idea di come dovrebbe apparire all'utente: s / he dovrebbe essere in grado di definire i due separatamente, ma le operazioni restituirebbero un tipo a seconda dei tipi di operandi (R * R = R, C * C = C, R * C = C * R = C). Inoltre R può essere castato in C e viceversa (semplicemente impostando le parti immaginarie su 0).

Ho preso in considerazione le seguenti opzioni:

  • Poiché un numero reale è un caso speciale di un numero complesso, eredita CMatrix da RMatrix . Ho rapidamente respinto questo dato che i due avrebbero dovuto restituire diversi tipi per la stessa funzione getter.

  • Eredita RMatrix e CMatrix da Matrix . Tuttavia, non riesco a pensare a un codice comune che vada in Matrix (a causa dei diversi tipi di ritorno).

  • Modelli. Dichiara Matrix<T> e dichiara la funzione getter come T Get(int i, int j) e l'operatore funziona come Matrix *(Matrix RHS) . Quindi specializza Matrix<double> e Matrix<complex> , e sovraccarichi le funzioni.

  • Quindi non potevo davvero vedere cosa avrei guadagnato con i template, quindi perché non definire solo RMatrix e CMatrix separatamente l'uno dall'altro, e quindi sovraccaricare le funzioni se necessario?

Anche se quest'ultima opzione ha senso per me, c'è una voce fastidiosa nella mia testa che dice che non è elegante, perché i due sono chiaramente correlati. Forse mi manca un modello di design appropriato?

Quindi immagino che quello che sto cercando sia l'assoluzione per farlo, o consigli su come fare meglio.

    
posta MGA 01.06.2014 - 22:08
fonte

1 risposta

3

Although this last option makes sense to me, there's an annoying voice inside my head saying this is not elegant, because the two are clearly related.

La tua difficoltà deriva dal fatto che i due sono chiaramente correlati. Probabilmente hai ragione, ma in questa forma piuttosto vaga, questa affermazione ti sta solo sconcertando invece di aiutarti. Quello che devi fare è trasformare chiaramente in una specifica dichiarazione sulle relazioni che ti aspetti all'interno dell'implementazione, e cosa implicano per il client della libreria e forse l'utente finale dell'applicazione che usa quel biblioteca. Una volta che hai questa specifica dichiarazione, puoi usarla per valutare i meriti e le demeriti dei tuoi vari disegni.

I do have a clear idea of what it should look like to the user: s/he should be able to define the two separately, but operations would return a type depending on the types of the operands (R*R = R, C*C = C, R*C = C*R = C)

Innanzitutto, definire un'interfaccia di questo tipo ha poco interesse pratico, ma hai avvertito tutti: questo è un esempio di giocattolo. Nei calcoli numerici, in cui uno usa tipicamente BLAS, le matrici sono enormi e talvolta veramente enormi così che in realtà si vuole evitare allocazioni di memoria implicite o automatiche e si usa un < em> register-like interfacce abbastanza simili a quella che troverete nella libreria originale.

Se vuoi digitare le formule come in un libro di matematica potresti fare della valutazione un passo in più, cioè R*R restituisce una formula, che, una volta valutata, restituisce una matrice effettiva, ad esempio

 C.eval(R*R)

imposta C sul prodotto di R e R.

I have considered the following options: […]

Cercare di modellare il mondo come lo comprendiamo (il tuo primo tentativo con RMatrix ← CMatrix) è spesso sbagliato nella programmazione OO perché ciò di cui abbiamo effettivamente bisogno è di modellare il mondo in un modo che rende i trattamenti che vogliamo fare facile da descrivere.

    
risposta data 02.06.2014 - 10:08
fonte

Leggi altre domande sui tag