Skip to content

Commit 6dd994f

Browse files
committed
Added convenience matrix multiplication function
1 parent 94960cf commit 6dd994f

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/phyc/matrix.c

+38
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,44 @@ double * Matrix_mult( const double *A, const double *B, size_t Am, size_t An, si
831831
return m;
832832
}
833833

834+
void Matrix_mult2( double* m, const double *A, const double *B, size_t Am, size_t An, size_t Bm, size_t Bn ){
835+
if( An != Bm ) error("Matrix_mult: incompatible size\n");
836+
memset(m, 0, sizeof(double)*Am*Bn);
837+
838+
size_t i,j,k;
839+
for( i = 0; i < Am; i++ ){
840+
for( j = 0; j < Bn; j++ ){
841+
for( k = 0; k < Bm; k++ )
842+
m[i*Bn+j] += A[i*An+k] * B[k*Bn+j];
843+
}
844+
}
845+
}
846+
847+
void Matrix_mult3( double* m, const double **A, const double *B, size_t Am, size_t An, size_t Bm, size_t Bn ){
848+
if( An != Bm ) error("Matrix_mult: incompatible size\n");
849+
memset(m, 0, sizeof(double)*Am*Bn);
850+
851+
size_t i,j,k;
852+
for( i = 0; i < Am; i++ ){
853+
for( j = 0; j < Bn; j++ ){
854+
for( k = 0; k < Bm; k++ )
855+
m[i*Bn+j] += A[i][k] * B[k*Bn+j];
856+
}
857+
}
858+
}
859+
860+
void Matrix_mult4( double* m, const double *A, const double **B, size_t Am, size_t An, size_t Bm, size_t Bn ){
861+
if( An != Bm ) error("Matrix_mult: incompatible size\n");
862+
memset(m, 0, sizeof(double)*Am*Bn);
863+
864+
size_t i,j,k;
865+
for( i = 0; i < Am; i++ ){
866+
for( j = 0; j < Bn; j++ ){
867+
for( k = 0; k < Bm; k++ )
868+
m[i*Bn+j] += A[i*An+k] * B[k][j];
869+
}
870+
}
871+
}
834872
#pragma mark -
835873
#pragma mark print functions
836874

src/phyc/matrix.h

+6
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,12 @@ unsigned int column_index( unsigned int i, unsigned int M);
217217

218218
double * Matrix_mult( const double *A, const double *B, size_t Am, size_t An, size_t Bm, size_t Bn );
219219

220+
void Matrix_mult2( double* m, const double *A, const double *B, size_t Am, size_t An, size_t Bm, size_t Bn );
221+
222+
void Matrix_mult3( double* m, const double **A, const double *B, size_t Am, size_t An, size_t Bm, size_t Bn );
223+
224+
void Matrix_mult4( double* m, const double *A, const double **B, size_t Am, size_t An, size_t Bm, size_t Bn );
225+
220226
void cov2cor(double* cov, int dim);
221227

222228
#endif

0 commit comments

Comments
 (0)