Arrays of Signed and Unsigned Chars

Manipulation ofarrays of bytes (signed or unsigned chars) is provided by the classes RWMathVec<T>, RWGenMat<T>, and RWMathArray<T>. Two typedefs are used:

 

typedef signed char SChar;

typedef unsigned char UChar;

For applications requiring only small integers, these classes may be used for high efficiency and compactness. They are also very useful for storing and manipulating graphical images and 8-bit data streams from A/D converters, digitizers, and so on. This makes it easy to take a 2-dimensional Fourier transform of a graphical image, for example:

 

#include <rw/math/genmat.h>

#include <rw/cfft2d.h>

#include <iostream.h>

 

int main()

{

// Define a matrix of unsigned chars:

RWGenMat<UChar> image;

cin >> image; // Read in the image

 

// Allocate a 2-D FFT server:

DComplexFFT2DServer serve;

 

// Calculate the Fourier Transform.

RWGenMat<DComplex> spectrum =

serve.fourier(RWConvertGenMat<UChar,DComplex>(image));

 

cout << spectrum; // Print periodogram

}

Notice that we use the integer representations of the elements for input/output of vectors of signed or unsigned chars, not the literal character constants. This can differ from the behavior of your compiler when a single element is printed on an output stream. For example, the code:

 

char a = '$';

cout << a;

prints $with most compilers. However, the code:

 

RWMathVec<SChar> a(3, '$');

cout << a;

always prints 36 36 36 with the Essential Math Module. This is because the vector classes are primarily a tool for manipulating numbers, not strings. The Essential Tools Module class RWCString should be used for manipulating strings.