Re: Matrix operations
On 7/23/2010 8:45 AM, et al. wrote:
Hi! I am learning C++, and I am trying to understand how operators work,
and should work. So, I've decided to do yet another matrix class!
Anyway, I'm stuck with deciding how I should implement things here,
mainly regarding operator overloading.
What I've done so far is this:
class cmatrix
{
public:
explicit cmatrix(unsigned int rows, unsigned int cols);
explicit cmatrix(cmatrix& src);
A copy c-tor does not have to be explicit. I am not even sure what it
means for a copy c-tor to be explicit. Also, the *usual* copy c-tor has
the reference to const as its argument:
cmatrix(cmatrix const& src);
(also why did you call it "cmatrix", why not just "matrix"? any
relation to the C language?)
virtual ~cmatrix();
virtual double& at(unsigned int r, unsigned int c);
virtual cmatrix& operator=(const cmatrix src);
Better to pass the argument by reference, and why is it virtual?
cmatrix& operator=(cmatrix const& src);
private:
vector<unsigned int, double> storage;
};
and I've successfully implemented the operator= (or better: it works),
but now I've doubts with other operations! Before that, is my copy
constructor well defined? And a silly question... does the operator=
need a reference, or is it ok to leave it as I wrote?
See above.
My question is easy: how do I multiply two matrices? I mean, in the
"definition" sense, this is not an algorithmic doubt! Let's suppose I
want to write this:
M = N * Q;
with M, N, and Q being cmatrix instances. That is the equivalent,
according to Stroustrup's book, of
M.operator=(N.operator*(Q));
The problem is... How should I declare the operator* ? I don't want to
modify N, and I'd like to avoid pointers! Forgive this silly question,
but I'm still learning! :)
You're doing fine. If you decide to make the multiplication operator a
member, then you do
matrix operator*(const matrix& other) const;
since it doesn't modify either operand. You could also define it a
non-member, and make it a friend:
friend matrix operator*(const matrix& L, const matrix& R);
Notice that the arithmetic operand will create an object and return it
by value.
Another problem is with cvector, derived from cmatrix. Will the same
operator work? Like:
v = M * w;
Not sure what you mean. What's a cvector?
or worse, what if I want to overwrite a cvector or cmatrix?
v = M * v;
That should not be a problem if you define the function correctly.
Return a value from it. The call to operator= will copy the returned
object into the second (right-hand side) operand *after* the value of
that operand were used to calculate the return value of the operator*.
Thanks for any help you can give me!
You're welcome, and ask more!
V
--
I do not respond to top-posted replies, please don't ask