home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
vis-ftp.cs.umass.edu
/
vis-ftp.cs.umass.edu.tar
/
vis-ftp.cs.umass.edu
/
pub
/
CMU
/
cmu_files
/
cal
/
matrix.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-11
|
5KB
|
225 lines
/* matrix.c -- library routines for constructing dynamic matrices
* with arbitrary bounds using Iliffe vectors
****************************************************************
* HISTORY
* 25-Nov-80 David Smith (drs) at Carnegie-Mellon University
* Changed virtual base address name to "el" for all data
* types (Previously vali, vald, ...) This was possible due to the
* compiler enhancement which keeps different structure declarations
* separate.
*
* 30-Oct-80 David Smith (drs) at Carnegie-Mellon University
* Rewritten for record-style matrices
*
* 28-Oct-80 David Smith (drs) at Carnegie-Mellon University
* Written.
*
*/
#include "matrix.h"
char *malloc();
cmat newcmat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register char *p, **b;
register int r, rows, cols;
cmat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (char **)
malloc(rows*sizeof(char *) + rows*cols*sizeof(char));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((char *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}
ucmat newucmat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register unsigned char *p, **b;
register int r, rows, cols;
ucmat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (unsigned char **)
malloc(rows*sizeof(unsigned char *)
+rows*cols*sizeof(unsigned char));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((unsigned char *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}
smat newsmat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register short *p, **b;
register int r, rows, cols;
smat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (short **)
malloc(rows*sizeof(short *) + rows*cols*sizeof(short));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((short *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}
imat newimat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register int *p, **b;
register int r, rows, cols;
imat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (int **)
malloc(rows*sizeof(int *) + rows*cols*sizeof(int));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((int *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}
lmat newlmat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register long *p, **b;
register int r, rows, cols;
lmat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (long **)
malloc(rows*sizeof(long *) + rows*cols*sizeof(long));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((long *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}
fmat newfmat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register float *p, **b;
register int r, rows, cols;
fmat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (float **)
malloc(rows*sizeof(float *) + rows*cols*sizeof(float));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((float *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}
dmat newdmat(rs, re, cs, ce, error)
int rs, re, cs, ce, *error;
{
register double *p, **b;
register int r, rows, cols;
dmat matrix;
rows = re-rs+1;
cols = ce-cs+1;
if (rows<=0 || cols<=0) {*error=1; return matrix;}
matrix.lb1 = rs;
matrix.ub1 = re;
matrix.lb2 = cs;
matrix.ub2 = ce;
b = (double **)
malloc(rows*sizeof(double *) + rows*cols*sizeof(double));
if (b==0) {*error=1; return(matrix);}
matrix.mat_sto = (char *) b;
*error=0;
p = ((double *) &b[rows]) - cs;
matrix.el = b -= rs;
for (r=rs; r<=re; r++)
{
b[r] = p;
p += cols;
}
return matrix;
}