[BACK]Return to mattran.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

File: [local] / OpenXM_contrib2 / asir2000 / builtin / mattran.c (download)

Revision 1.2, Sat Feb 22 07:22:16 2003 UTC (21 years, 2 months ago) by saito
Branch: MAIN
CVS Tags: R_1_3_1-2, RELEASE_1_3_1_13b, RELEASE_1_2_3_12, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, KNOPPIX_2006, DEB_REL_1_2_3-9
Changes since 1.1: +275 -61 lines

add matrix fundamental transformation functions.

/*
 * $OpenXM: OpenXM_contrib2/asir2000/builtin/mattran.c,v 1.2 2003/02/22 07:22:16 saito Exp $
 */

#include "ca.h"
#include "parse.h"

static void MatFund(NODE, Obj *);
static void RowMul(NODE, Obj *);
static void RowExh(NODE, Obj *);
static void RowMulAdd(NODE, Obj *);
static void BodyRowMul(MAT, int, pointer);
static void BodyRowExh(MAT, int, int);
static void BodyRowMulAdd(MAT, int, int, pointer);
static void ColMul(NODE, Obj *);
static void ColExh(NODE, Obj *);
static void ColMulAdd(NODE, Obj *);
static void BodyColMul(MAT, int, pointer);
static void BodyColExh(MAT, int, int);
static void BodyColMulAdd(MAT, int, int, pointer);

struct ftab mat_tab[] = {
	{"mfund",MatFund,-5},
	{"rowm",RowMul,3},
	{"rowx",RowExh,3},
	{"rowa",RowMulAdd,4},
	{"colm",ColMul,3},
	{"colx",ColExh,3},
	{"cola",ColMulAdd,4},
	{0,0,0},
};

static void
MatFund(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	pointer *coe;
	Q rowq, row2q, colq, col2q;
	int sw, row, row2, col, col2;
	sw = QTOS( (Q)ARG0(arg) );
	mat = (MAT)ARG1(arg);
	switch (sw) {
		case 1:
			rowq = (Q)ARG2(arg);
			row = QTOS( rowq );
			coe = (pointer)ARG3(arg);
			BodyRowMul( mat, row, coe );
			*rp = (Obj)mat;
			return;
		case 2:
			rowq = (Q)ARG2(arg);
			row = QTOS( rowq );
			row2q = (Q)ARG3(arg);
			row2 = QTOS( row2q );
			BodyRowExh( mat, row, row2 );
			*rp = (Obj)mat;
			return;
		case 3:
			rowq = (Q)ARG2(arg);
			row = QTOS( rowq );
			row2q = (Q)ARG3(arg);
			row2 = QTOS( row2q );
			coe = (pointer)ARG3(arg);
			BodyRowMulAdd( mat, row, row2, coe );
			*rp = (Obj)mat;
			return;
		case 4:
			colq = (Q)ARG2(arg);
			col = QTOS( colq );
			coe = (pointer)ARG3(arg);
			BodyColMul( mat, col, coe );
			*rp = (Obj)mat;
			return;
		case 5:
			colq = (Q)ARG2(arg);
			col = QTOS( colq );
			col2q = (Q)ARG3(arg);
			col2 = QTOS( col2q );
			BodyColExh( mat, col, col2 );
			*rp = (Obj)mat;
			return;
		case 6:
			colq = (Q)ARG2(arg);
			col = QTOS( colq );
			col2q = (Q)ARG3(arg);
			col2 = QTOS( col2q );
			coe = (pointer)ARG3(arg);
			BodyColMulAdd( mat, col, col2, coe );
			*rp = (Obj)mat;
		default:
			return;
			*rp = 0;
	}
}

static void
RowMul(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	Q rowq;
	pointer *coe;
	int row;

	mat = (MAT)ARG0(arg);
	rowq = (Q)ARG1(arg);
	row = QTOS( rowq );
	coe = (pointer)ARG2(arg);
	BodyRowMul( mat, row , coe );
	*rp = (Obj)mat;
}

static void
RowExh(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	Q QIndexA, QIndexB;
	int IndexA, IndexB;

	mat = (MAT)ARG0(arg);
	QIndexA = (Q)ARG1(arg);
	QIndexB = (Q)ARG2(arg);
	IndexA = QTOS( QIndexA );
	IndexB = QTOS( QIndexB );
	BodyRowExh( mat, IndexA, IndexB );
	*rp = (Obj)mat;
}

static void
RowMulAdd(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	Q QIndexA, QIndexB;
	int IndexA, IndexB;
	pointer *coe;

	mat = (MAT)ARG0(arg);
	QIndexA = (Q)ARG1(arg);
	QIndexB = (Q)ARG2(arg);
	coe = (pointer)ARG3(arg);
	IndexA = QTOS( QIndexA );
	IndexB = QTOS( QIndexB );
	BodyRowMulAdd( mat, IndexA, IndexB, coe );
	*rp = (Obj)mat;
}

static void
ColMul(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	Q QIndex;
	pointer *coe;
	int Index;

	mat = (MAT)ARG0(arg);
	QIndex = (Q)ARG1(arg);
	Index = QTOS( QIndex );
	coe = (pointer)ARG2(arg);
	BodyColMul( mat, Index , coe );
	*rp = (Obj)mat;
}

static void
ColExh(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	Q QIndexA, QIndexB;
	int IndexA, IndexB;

	mat = (MAT)ARG0(arg);
	QIndexA = (Q)ARG1(arg);
	QIndexB = (Q)ARG2(arg);
	IndexA = QTOS( QIndexA );
	IndexB = QTOS( QIndexB );
	BodyColExh( mat, IndexA, IndexB );
	*rp = (Obj)mat;
}

static void
ColMulAdd(arg, rp)
NODE arg;
Obj *rp;
{
	MAT mat;
	Q QIndexA, QIndexB;
	int IndexA, IndexB;
	pointer *coe;

	mat = (MAT)ARG0(arg);
	QIndexA = (Q)ARG1(arg);
	QIndexB = (Q)ARG2(arg);
	coe = (pointer)ARG3(arg);
	IndexA = QTOS( QIndexA );
	IndexB = QTOS( QIndexB );
	BodyColMulAdd( mat, IndexA, IndexB, coe );
	*rp = (Obj)mat;
}

static void
BodyRowMul( mat, row, coe )
MAT mat;
int row;
pointer coe;
{
	int size, i;
	pointer *t, *matrow;

	size = mat->col;
	matrow = BDY(mat)[row];
	for ( i = 0; i < size; i++ ) {
		mulr(CO,(Obj)matrow[i],(Obj)coe,(Obj *)&t);
		matrow[i]=(Obj)t;
	}
}

static void
BodyRowExh( mat, IndexA, IndexB )
MAT mat;
int IndexA, IndexB;
{
	int i, size;
	pointer *t, *PRowA, *PRowB;

	size = mat->col;
	PRowA = BDY(mat)[IndexA];
	PRowB = BDY(mat)[IndexB];
	for ( i = 0; i < size; i++ ) {
		t = PRowA[i];
		PRowA[i] = PRowB[i];
		PRowB[i] = t;
	}
}

static void
BodyRowMulAdd( mat, IndexA, IndexB, coe )
MAT mat;
int IndexA, IndexB;
pointer coe;
{
	int i, size;
	pointer *t, *PRowA, *PRowB;

	size = mat->col;
	PRowA = BDY(mat)[IndexA];
	PRowB = BDY(mat)[IndexB];

	for ( i = 0; i < size; i++ ) {
		mulr( CO, (Obj)PRowB[i], (Obj)coe, (Obj *)&t );
		addr( CO, (Obj)PRowA[i], (Obj)t, (Obj *)&t );
		PRowA[i] = t;
	}
}

static void
BodyColMul( mat, Index, coe )
MAT mat;
int Index;
pointer coe;
{
	int size, i;

	size = mat->row;
	for ( i = 0; i < size; i++ ) {
		mulr(CO, BDY(mat)[i][Index], (Obj)coe, (Obj *)&BDY(mat)[i][Index]);
	}
}

static void
BodyColExh( mat, IndexA, IndexB )
MAT mat;
int IndexA, IndexB;
{
	int i, size;
	pointer *t;

	size = mat->row;
	for ( i = 0; i < size; i++ ) {
		t = BDY(mat)[i][IndexA];
		BDY(mat)[i][IndexA] = BDY(mat)[i][IndexB];
		BDY(mat)[i][IndexB] = t;
	}
}

static void
BodyColMulAdd( mat, IndexA, IndexB, coe )
MAT mat;
int IndexA, IndexB;
pointer coe;
{
	int i, size;
	pointer *t;

	size = mat->row;
	for ( i = 0; i < size; i++ ) {
		mulr( CO, BDY(mat)[i][IndexB], coe, (Obj *)&t );
		addr( CO, BDY(mat)[i][IndexA], (Obj)t, (Obj *)&BDY(mat)[i][IndexA]);
	}
}