Handling Types for Real and Complex Matrices in a BLAS Wrapper
Posted
by
mga
on Programmers
See other posts from Programmers
or by mga
Published on 2014-06-01T20:08:35Z
Indexed on
2014/06/01
21:54 UTC
Read the original article
Hit count: 258
I come from a C background and I'm now learning OOP with C++. As an exercise (so please don't just say "this already exists"), I want to implement a wrapper for BLAS that will let the user write matrix algebra in an intuitive way (e.g. similar to MATLAB) e.g.:
A = B*C*D.Inverse() + E.Transpose();
My problem is how to go about dealing with real (R) and complex (C) matrices, because of C++'s "curse" of letting you do the same thing in N different ways.
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). Additionally R can be cast into C and vice versa (just by setting the imaginary parts to 0).
I have considered the following options:
As a real number is a special case of a complex number, inherit
CMatrix
fromRMatrix
. I quickly dismissed this as the two would have to return different types for the same getter function.Inherit
RMatrix
andCMatrix
fromMatrix
. However, I can't really think of any common code that would go intoMatrix
(because of the different return types).Templates. Declare
Matrix<T>
and declare the getter function asT Get(int i, int j)
, and operator functions asMatrix *(Matrix RHS)
. Then specializeMatrix<double>
andMatrix<complex>
, and overload the functions.Then I couldn't really see what I would gain with templates, so why not just define
RMatrix
andCMatrix
separately from each other, and then overload functions as necessary?
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. Perhaps I'm missing an appropriate design pattern?
So I guess what I'm looking for is either absolution for doing this, or advice on how to do better.
© Programmers or respective owner