Click here to Skip to main content
6,596,602 members and growing! (22,802 online)
Email Password   helpLost your password?
General Programming » Algorithms & Recipes » Algorithms     Intermediate License: The Code Project Open License (CPOL)

A matrix class with serialization and advanced input/output functions

By Roger Allen

A Matrix class derived from CObject with serialization and operator overloading
VC6, VC7Win2K, WinXP, Visual Studio, MFC, Dev
Posted:26 Jun 2002
Updated:12 Aug 2002
Views:187,256
Bookmarked:51 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
24 votes for this article.
Popularity: 6.06 Rating: 4.39 out of 5

1
1 vote, 9.1%
2

3
5 votes, 45.5%
4
5 votes, 45.5%
5

Overview

Matrices, do you hate them? I do, and they turn up all over the place in the projects I work with. So over time I have developed a class CMatrix to handle all the things we need, and some I expect to need in the future.

How the data is handled

First lets take an overview of how the class handles the data. The matrix data is allocated in a flat array of doubles with an integer reference counter at the end of the array. As the matrix is dynamic, we use a reference count system to avoid efficiency hits when assigning/copying one matrix into another. Two object can point to the same data, and they only diverge when one of them changes the data, getting its own copy of the data at that point. The data is only deleted when the last reference to it is being deleted. This has advantages for objects returned by function calls by value, and which are assigned by operator=, as there is little penalty in assigning a pointer compared to a new/copy operation.

Serialization

The CMatrix class inherits directly from CObject and is full serialization compatible.

CMatrixHelper

A small helper class has been added to allow a simulated CMatrix::operator[][] to work. I stole this idea shamelessly from Alex Chirokov's article 2D Matrix Container with [][] indexing. A nice way of doing it. Note also that you should not be creating any objects of this type in your own code. It is used for this purpose only.

Robustness

In DEBUG mode, the code compiles with 0 warnings/errors and has extensive ASSERTion checking through out, so it should catch any problems that you have (or I have) in code. Most of the functionality has been thoroughly checked, but I would recommend checking your results, just in case!

Constructors

You can construct a matrix object using the following methods:

  • CMatrix() Constructs a 1 * 1 array, this is the default constructor.
  • CMatrix(CMatrix& other) Copy constructor
  • CMatrix(nCols, nRows) Constructs a matrix of nCols * nRows dimensions. All data is 0.
  • CMatrix(size, diagonal) Constructs a square matrix with or without 1's on the diagonal.
  • CMatrix(VARIANT) Constructs a CMatrix object from a 2 dimension SAFEFARRAY variant.

As a note, any non-initialized matrix elements will be set to 0 on construction.

Operators overloaded

The following operators have been overloaded:

  • operator=(CMatrix) For standard assignment.

Arithmatic

  • operator+(CMatrix) Adds 2 matrices together, must be the same size
  • operator-(CMatrix) Subtracts 1 matrix from another, must be the same size
  • operator*(CMatrix) Multiples 2 matrices together, the two inner dimensions must be the same, e.g. 3*2 by 2*3
  • operator+=(CMatrix) Adds one matrix onto the current matrix, must have same dimensions.
  • operator-=(CMatrix) Subtracts one matrix from the current matrix, must have same dimensions.
  • operator*=(CMatrix) Mutiples the current matrix by the other matrix
  • operator*=(double) Multiples all matrix elements by the given value
  • operator*(CMatrix, double) Multiples all elements by the given value, returning a new matrix

Comparison

  • operator==(CMatrix) For matrix comparison, returns true if identical, false otherwise.

Element access

  • operator[](int) Works with the class CMatrixHelper to simulate a operator[][].

Get/Set functions

Two standard access function are provided.:

  • GetElement(nCol, nRow) returns the given element value
  • SetElement(nCol, nRow, value) Sets the given element to a different value

Other matrix functions

  • GetNumColumns() Returns the matrices columns dimension
  • GetNumRows() Returns the matrices rows dimension
  • SumColumn(column) Returns the sum of all elements in the given column
  • SumRow(row) Returns the sum of all elements in the given row
  • SumColumnSquared(column) Same as SumColumn() but the return value is squared
  • SumRowSquared(row) Same as SumRow() but the return value is squared
  • GetNumericRange(min, max) Returns the lower and upper values of elements in the matrix
  • GetSafeArray() Returns a VARIANT with a copy of the CMatrix data in a SAFEARRAY. Note that the VARIANT should be cleared using VariantClear(var) unless you pass the VARIANT to a different program (e.g. a COM component/VB) as it becomes their responsibility.
  • CopyToClipboard() Places the CMatrix data in the clipboard as CSV text, use this when debugging etc
  • WriteAsCSVFile(filename) Writes the matrix to a CSV file
  • ReadFromCSVFile(const CString& filename) Creates a new matrix from a CSV file.
  • Dump() TRACEs the matrix content to the debug stream
  • AssertValid() ASSERTs if the object is in an invalid state

Transposition

  • GetTransposed() Returns a new matrix which is a Transpose of the one called on
  • Transpose() Transposes the current matrix

Inversion

  • GetInverted() Returns the inversion of the current matrix
  • Invert() Inverts the current matrix

Covariant (A' * A)

  • Covariant() Returns the Covariant of the current matrix

Normalisation

  • GetNormalised(min, max) Returns the matrix with all values scaled between min and max
  • Normalise(min, max) Normalizes all values in the matrix between min and max

Concatenation

  • GetConcatinatedColumns(CMatrix) Returns a new matrix with the other matrix added onto the right hand side
  • ConcatinateColumns(CMatrix) Concatenates the additional columns onto the current matrix
  • GetConcatenatedRows(CMatrix) Returns a new matrix with the other matrix added onto the bottom of the current matrix
  • ConcatinateRows(CMatrix) Concatenates the additional rows onto the current matrix
  • AddColumn(double*) Adds a new column onto the current matrix
  • AddRow(double*) Adds a new row onto the current matrix

Extraction/substitution

  • ExtractSubMatrix(x, y, x_size, y_size) Extract a sub matrix from a larger matrix
  • SetSubMatrix(x, y, CMatrix) Substitutes a larger matrices elements with those from another matrix
  • ExtractDiagonal() Returns a x * 1 matrix with the values from the diagonal - square matrices only
  • GetSquareMatrix() Returns a square matrix of the smaller dimension, by stepping over rows/columns to make the matrix square
  • MakeSquare() Squares the current matrix by stepping over rows/columns

Other notes

All the code to handle the allocation/deallocation of matrix data and the reference counting is not covered here in the class interface as they are all private functions. You can see the documentation in the source code comments. (wow comments....:-D)

If you find any bugs or have some enhancements for the class, I would be happy if you would pass them along, and I will endeavour to keep the class fully up to date here.

Updates

13th August 2002

  • A small problem with CMatrixHelper when using operator[][] for element read access was fixed by making the return object const.
  • An invalid ASSERTion error in ExtractSubMatrix was fixed.
  • The operator= for CMatrixHelper now copies all member variables across into the target object.

2nd July 2002

  • A small typo in CMatrix::Invert() was fixed. Thanks to Jamie Plowman for spotting it.
  • As suggested, I made the class CMatrixHelper constructors protected and made CMatrix a friend so that only CMatrix can construct objects, not a user.

Enjoy!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Roger Allen


Member
A research and development programmer working for a pharmaceutical instrument company.

I am one of those lucky people who enjoys his work and spends more time than he should either doing work or reseaching new stuff. I can also be found on the odd counter-strike server sometimes, or playing DDO on the european Devourer server (Send a tell to "Ordinary" who is my current main)

I am also a keep fit fanatic, doing cross country running and am seriously into [url]http://www.ryushinkan.co.uk/[/url] Karate at this time of my life, training from 4-6 times a week.

Apart from computer games and fitness, I also enjoy Juggeling, unicycling and other circus type skills.

I also have 2 step daughters, aged 21 and 23. They are both nice girls, but expensive to keep in food/clothes/mobile phones/cello's/travel etc, Plus I get insulted by them a lot!

Occupation: Software Developer (Senior)
Company: Sirius Analytical Instruments
Location: United Kingdom United Kingdom

Other popular Algorithms & Recipes articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 97 (Total in Forum: 97) (Refresh)FirstPrevNext
Questioncompile error PinmemberMaryamR2:03 22 Apr '09  
Generalhelp me Pinmembercooljeff21:45 31 Mar '08  
Generalhi Pinmembersujithkumarsl21:36 4 Jun '07  
GeneralA better version of serialization Pinmembercristitomi0:56 15 Feb '07  
GeneralHow to use this class in Visual C++ 6.0 Pinmembercristitomi6:32 14 Feb '07  
GeneralRe: How to use this class in Visual C++ 6.0 Pinmemberwhynot12345621:54 31 Oct '09  
GeneralQuite slow for 8x8 inverse. Pinmemberchueh89:08 21 Sep '06  
GeneralEliminating the helper class Pinmembercwbenson5:15 14 Jul '06  
Generallink errors Pinmembercwbenson4:44 14 Jul '06  
GeneralError with creating CMatrix objects Pinmemberkimyuan8123:39 9 Mar '06  
Generalsomebody help! Pinmembergampalu5:41 14 Feb '06  
JokeJokes Pinmemberwepy88820:09 8 Dec '05  
GeneralI need introduce the values in matrix Pinmemberrubenss7:06 18 Oct '05  
Generalsome thing is wrong Pinmemberchen10006:17 13 Oct '05  
Generalto build cmatric Pinmemberzairee23:17 6 Sep '05  
Generalhelp..#include "stdafx.h" Pinmembermohamed radwan22:21 21 Jun '05  
GeneralComplile Error Pinmemberterrenzhong2:14 6 Jan '05  
GeneralRe: Complile Error Pinmemberphanduchuynh17:19 6 Jan '05  
GeneralProblem in compiling... plz help PinmemberNagarajan S.8:46 31 Aug '04  
GeneralRe: Problem in compiling... plz help PinmemberNagarajan S.9:20 31 Aug '04  
Generaloperator* fix? PinmemberJonny Gould23:58 12 Jul '04  
GeneralRe: operator* fix? PinmemberJonny Gould18:46 13 Jul '04  
GeneralRe: operator* fix? PinmemberBill Lim22:02 7 Nov '04  
Generalcan't compile source Pinmembermilan0818:13 24 Mar '04  
GeneralRow Reduction, Gaussian elimination, row echelon form, matrix inverse PinmemberJames Reilly17:17 6 Feb '04  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 12 Aug 2002
Editor: Nishant Sivakumar
Copyright 2002 by Roger Allen
Everything else Copyright © CodeProject, 1999-2009
Web20 | Advertise on the Code Project