diff options
Diffstat (limited to 'src/matrixOperations')
-rw-r--r-- | src/matrixOperations/Makefile.am | 31 | ||||
-rw-r--r-- | src/matrixOperations/Makefile.in | 79 | ||||
-rw-r--r-- | src/matrixOperations/matrixMultiplication.c | 153 | ||||
-rw-r--r-- | src/matrixOperations/matrixMultiplication.h | 82 | ||||
-rw-r--r-- | src/matrixOperations/testMatrixMultiplication.c | 224 |
5 files changed, 538 insertions, 31 deletions
diff --git a/src/matrixOperations/Makefile.am b/src/matrixOperations/Makefile.am index 2f57f7fc..1cc9266c 100644 --- a/src/matrixOperations/Makefile.am +++ b/src/matrixOperations/Makefile.am @@ -18,39 +18,42 @@ instdir = $(top_builddir)/lib pkglib_LTLIBRARIES = libMatrixOperations.la libMatrixOperations_la_SOURCES = $(ADDITIONHEAD) $(ADDITIONSRC) \ - $(SUBTRACTIONHEAD) $(SUBTRACTIONSRC) #\ - #$(MULTIPLICATIONHEAD) $(MULTIPLICATIONSRC) #\ + $(SUBTRACTIONHEAD) $(SUBTRACTIONSRC) \ + $(MULTIPLICATIONHEAD) $(MULTIPLICATIONSRC) #\ #$(DIVISIONHEAD) $(DIVISIONSRC) check_PROGRAMS = testMatrixAddition \ - testMatrixSubtraction #\ - #testMatrixDivision #\ - #testMatrixMultiplication + testMatrixSubtraction \ + testMatrixMultiplication #\ + #testMatrixDivision check_LDADD = $(top_builddir)/type/libDoubleComplex.la \ - $(top_builddir)/type/libFloatComplex.la + $(top_builddir)/type/libFloatComplex.la \ + $(top_builddir)/lib/blas/libsciblas.la \ + libMatrixOperations.la check_INCLUDES = -I $(top_builddir)/type \ -I . testMatrixAddition_SOURCES = testMatrixAddition.c -testMatrixAddition_LDADD = $(check_LDADD) libMatrixOperations.la +testMatrixAddition_LDADD = $(check_LDADD) testMatrixAddition_CFLAGS = $(check_INCLUDES) testMatrixSubtraction_SOURCES = testMatrixSubtraction.c -testMatrixSubtraction_LDADD = $(check_LDADD) libMatrixOperations.la +testMatrixSubtraction_LDADD = $(check_LDADD) testMatrixSubtraction_CFLAGS = $(check_INCLUDES) -#testMatrixMultiplication_SOURCES = testMatrixMultiplication.c -#testMatrixMultiplication_LDADD = $(check_LDADD) libMatrixOperations.la +testMatrixMultiplication_SOURCES = testMatrixMultiplication.c +testMatrixMultiplication_LDADD = $(check_LDADD) +testMatrixMultiplication_CFLAGS = $(check_INCLUDES) #testMatrixDivision_SOURCES = testMatrixAddition.c #testMatrixDivision_LDADD = libMatrixOperations.la TESTS = testMatrixAddition \ - testMatrixSubtraction #\ - #testMatrixMultiplication #\ + testMatrixSubtraction \ + testMatrixMultiplication #\ #testMatrixDivision @@ -60,8 +63,8 @@ ADDITIONSRC = matrixAddition.c SUBTRACTIONHEAD = matrixSubtraction.h SUBTRACTIONSRC = matrixSubtraction.c -#MULTIPLICATIONHEAD = matrixMultiplication.h -#MULTIPLICATIONSRC = matrixMultiplication.c +MULTIPLICATIONHEAD = matrixMultiplication.h +MULTIPLICATIONSRC = matrixMultiplication.c #DIVISIONHEAD = matrixDivision.h #DIVISIONSRC = matrixDivision.c diff --git a/src/matrixOperations/Makefile.in b/src/matrixOperations/Makefile.in index 0fb32d79..73f3b5f6 100644 --- a/src/matrixOperations/Makefile.in +++ b/src/matrixOperations/Makefile.in @@ -33,8 +33,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ check_PROGRAMS = testMatrixAddition$(EXEEXT) \ - testMatrixSubtraction$(EXEEXT) -TESTS = testMatrixAddition$(EXEEXT) testMatrixSubtraction$(EXEEXT) + testMatrixSubtraction$(EXEEXT) \ + testMatrixMultiplication$(EXEEXT) +TESTS = testMatrixAddition$(EXEEXT) testMatrixSubtraction$(EXEEXT) \ + testMatrixMultiplication$(EXEEXT) subdir = matrixOperations DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -57,8 +59,10 @@ libMatrixOperations_la_LIBADD = am__objects_1 = am__objects_2 = libMatrixOperations_la-matrixAddition.lo am__objects_3 = libMatrixOperations_la-matrixSubtraction.lo +am__objects_4 = libMatrixOperations_la-matrixMultiplication.lo am_libMatrixOperations_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - $(am__objects_1) $(am__objects_3) + $(am__objects_1) $(am__objects_3) $(am__objects_1) \ + $(am__objects_4) libMatrixOperations_la_OBJECTS = $(am_libMatrixOperations_la_OBJECTS) libMatrixOperations_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ @@ -67,17 +71,24 @@ libMatrixOperations_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ am_testMatrixAddition_OBJECTS = \ testMatrixAddition-testMatrixAddition.$(OBJEXT) testMatrixAddition_OBJECTS = $(am_testMatrixAddition_OBJECTS) -testMatrixAddition_DEPENDENCIES = $(check_LDADD) \ - libMatrixOperations.la +testMatrixAddition_DEPENDENCIES = $(check_LDADD) testMatrixAddition_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(testMatrixAddition_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ +am_testMatrixMultiplication_OBJECTS = \ + testMatrixMultiplication-testMatrixMultiplication.$(OBJEXT) +testMatrixMultiplication_OBJECTS = \ + $(am_testMatrixMultiplication_OBJECTS) +testMatrixMultiplication_DEPENDENCIES = $(check_LDADD) +testMatrixMultiplication_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(testMatrixMultiplication_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ am_testMatrixSubtraction_OBJECTS = \ testMatrixSubtraction-testMatrixSubtraction.$(OBJEXT) testMatrixSubtraction_OBJECTS = $(am_testMatrixSubtraction_OBJECTS) -testMatrixSubtraction_DEPENDENCIES = $(check_LDADD) \ - libMatrixOperations.la +testMatrixSubtraction_DEPENDENCIES = $(check_LDADD) testMatrixSubtraction_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(testMatrixSubtraction_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ @@ -95,9 +106,13 @@ LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libMatrixOperations_la_SOURCES) \ - $(testMatrixAddition_SOURCES) $(testMatrixSubtraction_SOURCES) + $(testMatrixAddition_SOURCES) \ + $(testMatrixMultiplication_SOURCES) \ + $(testMatrixSubtraction_SOURCES) DIST_SOURCES = $(libMatrixOperations_la_SOURCES) \ - $(testMatrixAddition_SOURCES) $(testMatrixSubtraction_SOURCES) + $(testMatrixAddition_SOURCES) \ + $(testMatrixMultiplication_SOURCES) \ + $(testMatrixSubtraction_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) @@ -217,26 +232,33 @@ libMatrixOperations_la_CFLAGS = -I $(top_builddir)/type \ instdir = $(top_builddir)/lib pkglib_LTLIBRARIES = libMatrixOperations.la libMatrixOperations_la_SOURCES = $(ADDITIONHEAD) $(ADDITIONSRC) \ - $(SUBTRACTIONHEAD) $(SUBTRACTIONSRC) #\ - #$(MULTIPLICATIONHEAD) $(MULTIPLICATIONSRC) #\ + $(SUBTRACTIONHEAD) $(SUBTRACTIONSRC) \ + $(MULTIPLICATIONHEAD) $(MULTIPLICATIONSRC) #\ #$(DIVISIONHEAD) $(DIVISIONSRC) check_LDADD = $(top_builddir)/type/libDoubleComplex.la \ - $(top_builddir)/type/libFloatComplex.la + $(top_builddir)/type/libFloatComplex.la \ + $(top_builddir)/lib/blas/libsciblas.la \ + libMatrixOperations.la check_INCLUDES = -I $(top_builddir)/type \ -I . testMatrixAddition_SOURCES = testMatrixAddition.c -testMatrixAddition_LDADD = $(check_LDADD) libMatrixOperations.la +testMatrixAddition_LDADD = $(check_LDADD) testMatrixAddition_CFLAGS = $(check_INCLUDES) testMatrixSubtraction_SOURCES = testMatrixSubtraction.c -testMatrixSubtraction_LDADD = $(check_LDADD) libMatrixOperations.la +testMatrixSubtraction_LDADD = $(check_LDADD) testMatrixSubtraction_CFLAGS = $(check_INCLUDES) +testMatrixMultiplication_SOURCES = testMatrixMultiplication.c +testMatrixMultiplication_LDADD = $(check_LDADD) +testMatrixMultiplication_CFLAGS = $(check_INCLUDES) ADDITIONHEAD = matrixAddition.h ADDITIONSRC = matrixAddition.c SUBTRACTIONHEAD = matrixSubtraction.h SUBTRACTIONSRC = matrixSubtraction.c +MULTIPLICATIONHEAD = matrixMultiplication.h +MULTIPLICATIONSRC = matrixMultiplication.c all: all-am .SUFFIXES: @@ -309,6 +331,9 @@ clean-checkPROGRAMS: testMatrixAddition$(EXEEXT): $(testMatrixAddition_OBJECTS) $(testMatrixAddition_DEPENDENCIES) @rm -f testMatrixAddition$(EXEEXT) $(testMatrixAddition_LINK) $(testMatrixAddition_OBJECTS) $(testMatrixAddition_LDADD) $(LIBS) +testMatrixMultiplication$(EXEEXT): $(testMatrixMultiplication_OBJECTS) $(testMatrixMultiplication_DEPENDENCIES) + @rm -f testMatrixMultiplication$(EXEEXT) + $(testMatrixMultiplication_LINK) $(testMatrixMultiplication_OBJECTS) $(testMatrixMultiplication_LDADD) $(LIBS) testMatrixSubtraction$(EXEEXT): $(testMatrixSubtraction_OBJECTS) $(testMatrixSubtraction_DEPENDENCIES) @rm -f testMatrixSubtraction$(EXEEXT) $(testMatrixSubtraction_LINK) $(testMatrixSubtraction_OBJECTS) $(testMatrixSubtraction_LDADD) $(LIBS) @@ -320,8 +345,10 @@ distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixOperations_la-matrixAddition.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixOperations_la-matrixMultiplication.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixOperations_la-matrixSubtraction.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMatrixAddition-testMatrixAddition.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMatrixSubtraction-testMatrixSubtraction.Po@am__quote@ .c.o: @@ -359,6 +386,13 @@ libMatrixOperations_la-matrixSubtraction.lo: matrixSubtraction.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixOperations_la_CFLAGS) $(CFLAGS) -c -o libMatrixOperations_la-matrixSubtraction.lo `test -f 'matrixSubtraction.c' || echo '$(srcdir)/'`matrixSubtraction.c +libMatrixOperations_la-matrixMultiplication.lo: matrixMultiplication.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixOperations_la_CFLAGS) $(CFLAGS) -MT libMatrixOperations_la-matrixMultiplication.lo -MD -MP -MF $(DEPDIR)/libMatrixOperations_la-matrixMultiplication.Tpo -c -o libMatrixOperations_la-matrixMultiplication.lo `test -f 'matrixMultiplication.c' || echo '$(srcdir)/'`matrixMultiplication.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libMatrixOperations_la-matrixMultiplication.Tpo $(DEPDIR)/libMatrixOperations_la-matrixMultiplication.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='matrixMultiplication.c' object='libMatrixOperations_la-matrixMultiplication.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixOperations_la_CFLAGS) $(CFLAGS) -c -o libMatrixOperations_la-matrixMultiplication.lo `test -f 'matrixMultiplication.c' || echo '$(srcdir)/'`matrixMultiplication.c + testMatrixAddition-testMatrixAddition.o: testMatrixAddition.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixAddition_CFLAGS) $(CFLAGS) -MT testMatrixAddition-testMatrixAddition.o -MD -MP -MF $(DEPDIR)/testMatrixAddition-testMatrixAddition.Tpo -c -o testMatrixAddition-testMatrixAddition.o `test -f 'testMatrixAddition.c' || echo '$(srcdir)/'`testMatrixAddition.c @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testMatrixAddition-testMatrixAddition.Tpo $(DEPDIR)/testMatrixAddition-testMatrixAddition.Po @@ -373,6 +407,20 @@ testMatrixAddition-testMatrixAddition.obj: testMatrixAddition.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixAddition_CFLAGS) $(CFLAGS) -c -o testMatrixAddition-testMatrixAddition.obj `if test -f 'testMatrixAddition.c'; then $(CYGPATH_W) 'testMatrixAddition.c'; else $(CYGPATH_W) '$(srcdir)/testMatrixAddition.c'; fi` +testMatrixMultiplication-testMatrixMultiplication.o: testMatrixMultiplication.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixMultiplication_CFLAGS) $(CFLAGS) -MT testMatrixMultiplication-testMatrixMultiplication.o -MD -MP -MF $(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Tpo -c -o testMatrixMultiplication-testMatrixMultiplication.o `test -f 'testMatrixMultiplication.c' || echo '$(srcdir)/'`testMatrixMultiplication.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Tpo $(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testMatrixMultiplication.c' object='testMatrixMultiplication-testMatrixMultiplication.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixMultiplication_CFLAGS) $(CFLAGS) -c -o testMatrixMultiplication-testMatrixMultiplication.o `test -f 'testMatrixMultiplication.c' || echo '$(srcdir)/'`testMatrixMultiplication.c + +testMatrixMultiplication-testMatrixMultiplication.obj: testMatrixMultiplication.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixMultiplication_CFLAGS) $(CFLAGS) -MT testMatrixMultiplication-testMatrixMultiplication.obj -MD -MP -MF $(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Tpo -c -o testMatrixMultiplication-testMatrixMultiplication.obj `if test -f 'testMatrixMultiplication.c'; then $(CYGPATH_W) 'testMatrixMultiplication.c'; else $(CYGPATH_W) '$(srcdir)/testMatrixMultiplication.c'; fi` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Tpo $(DEPDIR)/testMatrixMultiplication-testMatrixMultiplication.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testMatrixMultiplication.c' object='testMatrixMultiplication-testMatrixMultiplication.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixMultiplication_CFLAGS) $(CFLAGS) -c -o testMatrixMultiplication-testMatrixMultiplication.obj `if test -f 'testMatrixMultiplication.c'; then $(CYGPATH_W) 'testMatrixMultiplication.c'; else $(CYGPATH_W) '$(srcdir)/testMatrixMultiplication.c'; fi` + testMatrixSubtraction-testMatrixSubtraction.o: testMatrixSubtraction.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixSubtraction_CFLAGS) $(CFLAGS) -MT testMatrixSubtraction-testMatrixSubtraction.o -MD -MP -MF $(DEPDIR)/testMatrixSubtraction-testMatrixSubtraction.Tpo -c -o testMatrixSubtraction-testMatrixSubtraction.o `test -f 'testMatrixSubtraction.c' || echo '$(srcdir)/'`testMatrixSubtraction.c @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testMatrixSubtraction-testMatrixSubtraction.Tpo $(DEPDIR)/testMatrixSubtraction-testMatrixSubtraction.Po @@ -649,9 +697,6 @@ uninstall-am: uninstall-pkglibLTLIBRARIES uninstall-am uninstall-pkglibLTLIBRARIES -#MULTIPLICATIONHEAD = matrixMultiplication.h -#MULTIPLICATIONSRC = matrixMultiplication.c - #DIVISIONHEAD = matrixDivision.h #DIVISIONSRC = matrixDivision.c # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/src/matrixOperations/matrixMultiplication.c b/src/matrixOperations/matrixMultiplication.c index e69de29b..e8e66e60 100644 --- a/src/matrixOperations/matrixMultiplication.c +++ b/src/matrixOperations/matrixMultiplication.c @@ -0,0 +1,153 @@ +/* + * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab + * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET + * + * This file must be used under the terms of the CeCILL. + * This source file is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at + * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt + * + */ + +#include <assert.h> +#include "blas.h" +#include "matrixMultiplication.h" + +/* +** \brief Compute a multiplication for floats matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void smulma(float *in1, int lines1, int columns1, + float *in2, int lines2, int columns2, + float *out) +{ + int i = 0; + int k = 0; + float accu = 0; + +#define in1(a, b) in1[a+b*lines1] +#define in2(c, d) in2[c+d*lines2] + + for (i = 0 ; i < lines1 * columns2 ; ++i) + { + accu = 0; + for (k = 0; k < columns1 ; ++k) + { + accu += in1(i % lines1, k) * in2(k, i / lines1); + } + out[i] = accu; + } + +} + +/* +** \brief Compute a multiplication for doubles matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void dmulma(double *in1, int lines1, int columns1, + double *in2, int lines2, int columns2, + double *out) +{ + double One = 1; + double Zero = 0; + + /* Cr <- 1*Ar*Br + 0*Cr */ + dgemm_("N","N", &columns2, &columns2, &columns1, &One, + in1 , &lines1, in2, &lines2, &Zero, out, &columns2); +} + +/* +** \brief Compute a multiplication for floats complex matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void cmulma(floatComplex *in1, int lines1, int columns1, + floatComplex *in2, int lines2, int columns2, + floatComplex *out) +{ + int i = 0; + int k = 0; + floatComplex accu = FloatComplex(0, 0); + + for (i = 0 ; i < lines1 * columns2 ; ++i) + { + accu = FloatComplex(0,0); + for (k = 0; k < columns1 ; ++k) + { + cadds(accu, ctimess(in1(i % lines1, k) , in2(k, i / lines1))); + } + out[i] = accu; + } +} + +/* +** \brief Compute a multiplication for doubles matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void zmulma(doubleComplex *in1, int lines1, int columns1, + doubleComplex *in2, int lines2, int columns2, + doubleComplex *out) +{ + double One = 1; + double MinusOne = -1; + double Zero = 0; + + double *in1Real = malloc((uint) lines1 * (uint) columns1 * sizeof(double)); + double *in1Imag = malloc((uint) lines1 * (uint) columns1 * sizeof(double)); + double *in2Real = malloc((uint) lines2 * (uint) columns2 * sizeof(double)); + double *in2Imag = malloc((uint) lines2 * (uint) columns2 * sizeof(double)); + + double *RealOut = malloc((uint) lines1 * (uint) columns2 * sizeof(double)); + double *ImagOut = malloc((uint) lines1 * (uint) columns2 * sizeof(double)); + + zreala(in1, lines1 * columns1, in1Real); + zreala(in2, lines2 * columns2, in2Real); + zimaga(in1, lines1 * columns1, in1Imag); + zimaga(in2, lines2 * columns2, in2Imag); + + /* Cr <- 1*Ar*Br + 0*Cr */ + dgemm_("N","N", &lines1, &columns2, &columns1, &One, + in1Real, &lines1, in2Real, &lines2, &Zero, RealOut, &lines1); + + /* Cr <- -1*Ai*Bi + 1*Cr */ + dgemm_("N","N", &lines1, &columns2, &columns1, &MinusOne, + in1Imag, &lines1, in2Imag, &lines2, &One, RealOut, &lines1); + + /* Ci <- 1*Ar*Bi + 0*Ci */ + dgemm_("N","N", &lines1, &columns2, &columns1, &One, + in1Real, &lines1, in2Imag, &lines2, &Zero, ImagOut, &lines1); + + /*Ci <- 1*Ai*Br + 1*Ci */ + dgemm_("N","N", &lines1, &columns2, &columns1, &One, + in1Imag, &lines1, in2Real, &lines2, &One, ImagOut, &lines1); + + out = DoubleComplexMatrix(RealOut, ImagOut, lines1 * columns2); + free(in1Real); + free(in2Real); + free(in1Imag); + free(in1Imag); +} diff --git a/src/matrixOperations/matrixMultiplication.h b/src/matrixOperations/matrixMultiplication.h index e69de29b..413f8d96 100644 --- a/src/matrixOperations/matrixMultiplication.h +++ b/src/matrixOperations/matrixMultiplication.h @@ -0,0 +1,82 @@ +/* + * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab + * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET + * + * This file must be used under the terms of the CeCILL. + * This source file is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at + * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt + * + */ + +#ifndef __MATRIXMULTIPLICATION_H__ +#define __MATRIXMULTIPLICATION_H__ + +#include "floatComplex.h" +#include "doubleComplex.h" + +/* +** +** WARNING WE ASSUME MATRIXES TO BE CONSCISTENT +** columns1 = lines2; +** +*/ + +/* +** \brief Compute a multiplication for floats matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void smulma(float *in1, int lines1, int columns1, + float *in2, int lines2, int columns2, + float *out); + +/* +** \brief Compute a multiplication for doubles matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void dmulma(double *in1, int lines1, int columns1, + double *in2, int lines2, int columns2, + double *out); + +/* +** \brief Compute a multiplication for floats complex matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void cmulma(floatComplex *in1, int lines1, int columns1, + floatComplex *in2, int lines2, int columns2, + floatComplex *out); + +/* +** \brief Compute a multiplication for doubles matrixes. +** \param in1 : input matrix. +** \param lines1 : lines of in1 matrix. +** \param columns1 : columns of in1 matrix. +** \param in2 : input arry. +** \param lines2 : lines of in2 matrix. +** \param columns2 : columns of in2 matrix. +** \param out : Matrix that contains the multiplication in1 * in2. +*/ +void zmulma(doubleComplex *in1, int lines1, int columns1, + doubleComplex *in2, int lines2, int columns2, + doubleComplex *out); + +#endif /* !__MATRIXMULTIPLICATION_H__ */ diff --git a/src/matrixOperations/testMatrixMultiplication.c b/src/matrixOperations/testMatrixMultiplication.c new file mode 100644 index 00000000..38f59405 --- /dev/null +++ b/src/matrixOperations/testMatrixMultiplication.c @@ -0,0 +1,224 @@ +/* + * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab + * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET + * + * This file must be used under the terms of the CeCILL. + * This source file is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at + * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt + * + */ + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <math.h> +#include "matrixMultiplication.h" + + +#define LOCAL_DEBUG + +/* + static void zaddmaTest(void) { + doubleComplex M1[SIZE]; + doubleComplex M2[SIZE]; + doubleComplex M1_mul_M2[SIZE]; + + int i = 0; + + srand(1); + for (i = 0; i < SIZE; ++i) { + M1[i] = DoubleComplex((double) rand(), (double) rand()); + M2[i] = DoubleComplex((double) rand(), (double) rand()); + } + zaddma(M1, SIZE, M2, SIZE, M1_and_M2); + for (i = 0; i < SIZE; ++i) { + #ifdef LOCAL_DEBUG + printf("M1_and_M2 = %e + %e i\n", zreals(M1_and_M2[i]), zimags(M1_and_M2[i])); + #endif + assert(zreals(M1_and_M2[i]) - (zreals(M1[i]) + zreals(M2[i])) == 0); + assert(zimags(M1_and_M2[i]) - (zimags(M1[i]) + zimags(M2[i])) == 0); + } + } + + static void caddmaTest(void) { + floatComplex M1[SIZE]; + floatComplex M2[SIZE]; + floatComplex M1_and_M2[SIZE]; + + int i = 0; + + srand(1); + for (i = 0; i < SIZE; ++i) { + M1[i] = FloatComplex((float) rand(), (float) rand()); + M2[i] = FloatComplex((float) rand(), (float) rand()); + } + caddma(M1, SIZE, M2, SIZE, M1_and_M2); + for (i = 0; i < SIZE; ++i) { + #ifdef LOCAL_DEBUG + printf("M1_and_M2 = %e + %e i\n", creals(M1_and_M2[i]), cimags(M1_and_M2[i])); + #endif + assert(fabsf(creals(M1_and_M2[i]) - (creals(M1[i]) + creals(M2[i]))) / creals(M1_and_M2[i]) < 1e-07); + assert(fabsf(cimags(M1_and_M2[i]) - (cimags(M1[i]) + cimags(M2[i]))) / cimags(M1_and_M2[i]) < 1e-07); + } + } + +*/ +static void dmulmaTest(void) { + double M1[4] = {1.0, 2.0, 3.0, 4.0}; + double M2[4] = {1.0, 2.0, 3.0, 4.0}; + double M1_by_M2[4]; + double M3[4] = {1.0, 0.0, 1.0, 0.0}; + double M4[4] = {0.0, 1.0, 0.0, 1.0}; + double M3_by_M4[4]; + double M5[4] = {1.0, 0.0, 0.0, 1.0}; + double M6[4] = {42.0, 51.0, 69.0, 1664.0}; + double M5_by_M6[4]; + double M7[6] = {1.0, 4.0, 2.0, 5.0, 3.0, 6.0}; + double M8[6] = {1.0, 3.0, 5.0, 2.0, 4.0, 6.0}; + double M7_by_M8[4]; + + int i = 0; + + printf("\n>>>> Matrix Double Multiplication Tests\n"); + /* + [ 1 3 ] * [ 1 3 ] = [ 7 15 ] + [ 2 4 ] [ 2 4 ] [10 22 ] + */ + dmulma(M1, 2, 2, M2, 2, 2, M1_by_M2); + for (i = 0; i < 4; ++i) { + printf("M1_by_M2[%d] = %e\n", i, M1_by_M2[i]); + } + assert(M1_by_M2[0] == 7.0); + assert(M1_by_M2[1] == 10.0); + assert(M1_by_M2[2] == 15.0); + assert(M1_by_M2[3] == 22.0); + /* + [ 1 1 ] * [ 0 0 ] = [ 1 1 ] + [ 0 0 ] [ 1 1 ] [ 0 0 ] + */ + dmulma(M3, 2, 2, M4, 2, 2, M3_by_M4); + for (i = 0; i < 4; ++i) { + printf("M3_by_M4[%d] = %e\n", i, M3_by_M4[i]); + } + assert(M3_by_M4[0] == 1.0); + assert(M3_by_M4[1] == 0.0); + assert(M3_by_M4[2] == 1.0); + assert(M3_by_M4[3] == 0.0); + + /* + [ 1 0 ] * [ 42 69 ] = [ 42 69 ] + [ 0 1 ] [ 51 1664 ] [ 51 1664 ] + */ + dmulma(M5, 2, 2, M6, 2, 2, M5_by_M6); + for (i = 0; i < 4; ++i) { + printf("M5_by_M6[%d] = %e\n", i, M5_by_M6[i]); + } + assert(M5_by_M6[0] == 42.0); + assert(M5_by_M6[1] == 51.0); + assert(M5_by_M6[2] == 69.0); + assert(M5_by_M6[3] == 1664.0); + + /* + [ 1 2 3 ] * [ 1 2 ] = [ 22 28 ] + [ 4 5 6 ] [ 3 4 ] [ 49 64 ] + [ 5 6 ] + */ + dmulma(M7, 2, 3, M8, 3, 2, M7_by_M8); + for (i = 0; i < 4; ++i) { + printf("M7_by_M8[%d] = %e\n", i, M7_by_M8[i]); + } + assert(M7_by_M8[0] == 22.0); + assert(M7_by_M8[1] == 49.0); + assert(M7_by_M8[2] == 28.0); + assert(M7_by_M8[3] == 64.0); +} + +static void smulmaTest(void) { + float M1[4] = {1.0f, 2.0f, 3.0f, 4.0f}; + float M2[4] = {1.0f, 2.0f, 3.0f, 4.0f}; + float M1_by_M2[4]; + float M3[4] = {1.0f, 0.0f, 1.0f, 0.0f}; + float M4[4] = {0.0f, 1.0f, 0.0f, 1.0f}; + float M3_by_M4[4]; + float M5[4] = {1.0f, 0.0f, 0.0f, 1.0f}; + float M6[4] = {42.0f, 51.0f, 69.0f, 1664.0f}; + float M5_by_M6[4]; + float M7[6] = {1.0f, 4.0f, 2.0f, 5.0f, 3.0f, 6.0f}; + float M8[6] = {1.0f, 3.0f, 5.0f, 2.0f, 4.0f, 6.0f}; + float M7_by_M8[4]; + int i = 0; + + printf("\n>>>> Matrix Float Multiplication Tests\n"); + /* + [ 1 3 ] * [ 1 3 ] = [ 7 15 ] + [ 2 4 ] [ 2 4 ] [10 22 ] + */ + smulma(M1, 2, 2, M2, 2, 2, M1_by_M2); + for (i = 0; i < 4; ++i) { + printf("M1_by_M2[%d] = %e\n", i, M1_by_M2[i]); + } + assert(M1_by_M2[0] == 7.0f); + assert(M1_by_M2[1] == 10.0f); + assert(M1_by_M2[2] == 15.0f); + assert(M1_by_M2[3] == 22.0f); + /* + [ 1 1 ] * [ 0 0 ] = [ 1 1 ] + [ 0 0 ] [ 1 1 ] [ 0 0 ] + */ + smulma(M3, 2, 2, M4, 2, 2, M3_by_M4); + for (i = 0; i < 4; ++i) { + printf("M3_by_M4[%d] = %e\n", i, M3_by_M4[i]); + } + assert(M3_by_M4[0] == 1.0f); + assert(M3_by_M4[1] == 0.0f); + assert(M3_by_M4[2] == 1.0f); + assert(M3_by_M4[3] == 0.0f); + + /* + [ 1 0 ] * [ 42 69 ] = [ 42 69 ] + [ 0 1 ] [ 51 1664 ] [ 51 1664 ] + */ + smulma(M5, 2, 2, M6, 2, 2, M5_by_M6); + for (i = 0; i < 4; ++i) { + printf("M5_by_M6[%d] = %e\n", i, M5_by_M6[i]); + } + assert(M5_by_M6[0] == 42.0f); + assert(M5_by_M6[1] == 51.0f); + assert(M5_by_M6[2] == 69.0f); + assert(M5_by_M6[3] == 1664.0f); + + /* + [ 1 2 3 ] * [ 1 2 ] = [ 22 28 ] + [ 4 5 6 ] [ 3 4 ] [ 49 64 ] + [ 5 6 ] + */ + smulma(M7, 2, 3, M8, 3, 2, M7_by_M8); + for (i = 0; i < 4; ++i) { + printf("M7_by_M8[%d] = %e\n", i, M7_by_M8[i]); + } + assert(M7_by_M8[0] == 22.0f); + assert(M7_by_M8[1] == 49.0f); + assert(M7_by_M8[2] == 28.0f); + assert(M7_by_M8[3] == 64.0f); +} + +static int testMultiplication(void) { + + printf("\n>>>> Matrix Multiplication Tests\n"); + dmulmaTest(); + smulmaTest(); + /* + cmulmaTest(); + zmulmaTest(); + */ + return 0; +} + + + +int main(void) { + assert(testMultiplication() == 0); + return 0; +} |