diff options
Diffstat (limited to 'src/matrixOperations/multiplication')
-rw-r--r-- | src/matrixOperations/multiplication/Makefile.am | 5 | ||||
-rw-r--r-- | src/matrixOperations/multiplication/Makefile.in | 47 | ||||
-rw-r--r-- | src/matrixOperations/multiplication/cmulma.c | 44 | ||||
-rw-r--r-- | src/matrixOperations/multiplication/dmulma.c | 67 | ||||
-rw-r--r-- | src/matrixOperations/multiplication/smulma.c | 172 | ||||
-rw-r--r-- | src/matrixOperations/multiplication/zmulma.c | 102 |
6 files changed, 256 insertions, 181 deletions
diff --git a/src/matrixOperations/multiplication/Makefile.am b/src/matrixOperations/multiplication/Makefile.am index 2d7dbee3..f6d1102f 100644 --- a/src/matrixOperations/multiplication/Makefile.am +++ b/src/matrixOperations/multiplication/Makefile.am @@ -17,7 +17,10 @@ instdir = $(top_builddir)/lib pkglib_LTLIBRARIES = libMatrixMultiplication.la -libMatrixMultiplication_la_SOURCES = matrixMultiplication.c +libMatrixMultiplication_la_SOURCES = smulma.c \ + dmulma.c \ + cmulma.c \ + zmulma.c check_PROGRAMS = testMatrixMultiplication diff --git a/src/matrixOperations/multiplication/Makefile.in b/src/matrixOperations/multiplication/Makefile.in index 7983fe53..79837254 100644 --- a/src/matrixOperations/multiplication/Makefile.in +++ b/src/matrixOperations/multiplication/Makefile.in @@ -54,7 +54,10 @@ pkglibLTLIBRARIES_INSTALL = $(INSTALL) LTLIBRARIES = $(pkglib_LTLIBRARIES) libMatrixMultiplication_la_LIBADD = am_libMatrixMultiplication_la_OBJECTS = \ - libMatrixMultiplication_la-matrixMultiplication.lo + libMatrixMultiplication_la-smulma.lo \ + libMatrixMultiplication_la-dmulma.lo \ + libMatrixMultiplication_la-cmulma.lo \ + libMatrixMultiplication_la-zmulma.lo libMatrixMultiplication_la_OBJECTS = \ $(am_libMatrixMultiplication_la_OBJECTS) libMatrixMultiplication_la_LINK = $(LIBTOOL) --tag=CC \ @@ -204,7 +207,11 @@ libMatrixMultiplication_la_CFLAGS = -I $(top_builddir)/type \ instdir = $(top_builddir)/lib pkglib_LTLIBRARIES = libMatrixMultiplication.la -libMatrixMultiplication_la_SOURCES = matrixMultiplication.c +libMatrixMultiplication_la_SOURCES = smulma.c \ + dmulma.c \ + cmulma.c \ + zmulma.c + check_LDADD = $(top_builddir)/type/libDoubleComplex.la \ $(top_builddir)/type/libFloatComplex.la \ $(top_builddir)/lib/blas/libsciblas.la \ @@ -297,7 +304,10 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixMultiplication_la-matrixMultiplication.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixMultiplication_la-cmulma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixMultiplication_la-dmulma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixMultiplication_la-smulma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libMatrixMultiplication_la-zmulma.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMatrixMultiplication-testDoubleMatrixMultiplication.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testMatrixMultiplication-testFloatMatrixMultiplication.Po@am__quote@ @@ -322,12 +332,33 @@ distclean-compile: @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< -libMatrixMultiplication_la-matrixMultiplication.lo: matrixMultiplication.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -MT libMatrixMultiplication_la-matrixMultiplication.lo -MD -MP -MF $(DEPDIR)/libMatrixMultiplication_la-matrixMultiplication.Tpo -c -o libMatrixMultiplication_la-matrixMultiplication.lo `test -f 'matrixMultiplication.c' || echo '$(srcdir)/'`matrixMultiplication.c -@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libMatrixMultiplication_la-matrixMultiplication.Tpo $(DEPDIR)/libMatrixMultiplication_la-matrixMultiplication.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='matrixMultiplication.c' object='libMatrixMultiplication_la-matrixMultiplication.lo' libtool=yes @AMDEPBACKSLASH@ +libMatrixMultiplication_la-smulma.lo: smulma.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -MT libMatrixMultiplication_la-smulma.lo -MD -MP -MF $(DEPDIR)/libMatrixMultiplication_la-smulma.Tpo -c -o libMatrixMultiplication_la-smulma.lo `test -f 'smulma.c' || echo '$(srcdir)/'`smulma.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libMatrixMultiplication_la-smulma.Tpo $(DEPDIR)/libMatrixMultiplication_la-smulma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='smulma.c' object='libMatrixMultiplication_la-smulma.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) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -c -o libMatrixMultiplication_la-smulma.lo `test -f 'smulma.c' || echo '$(srcdir)/'`smulma.c + +libMatrixMultiplication_la-dmulma.lo: dmulma.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -MT libMatrixMultiplication_la-dmulma.lo -MD -MP -MF $(DEPDIR)/libMatrixMultiplication_la-dmulma.Tpo -c -o libMatrixMultiplication_la-dmulma.lo `test -f 'dmulma.c' || echo '$(srcdir)/'`dmulma.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libMatrixMultiplication_la-dmulma.Tpo $(DEPDIR)/libMatrixMultiplication_la-dmulma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dmulma.c' object='libMatrixMultiplication_la-dmulma.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) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -c -o libMatrixMultiplication_la-dmulma.lo `test -f 'dmulma.c' || echo '$(srcdir)/'`dmulma.c + +libMatrixMultiplication_la-cmulma.lo: cmulma.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -MT libMatrixMultiplication_la-cmulma.lo -MD -MP -MF $(DEPDIR)/libMatrixMultiplication_la-cmulma.Tpo -c -o libMatrixMultiplication_la-cmulma.lo `test -f 'cmulma.c' || echo '$(srcdir)/'`cmulma.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libMatrixMultiplication_la-cmulma.Tpo $(DEPDIR)/libMatrixMultiplication_la-cmulma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cmulma.c' object='libMatrixMultiplication_la-cmulma.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) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -c -o libMatrixMultiplication_la-cmulma.lo `test -f 'cmulma.c' || echo '$(srcdir)/'`cmulma.c + +libMatrixMultiplication_la-zmulma.lo: zmulma.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -MT libMatrixMultiplication_la-zmulma.lo -MD -MP -MF $(DEPDIR)/libMatrixMultiplication_la-zmulma.Tpo -c -o libMatrixMultiplication_la-zmulma.lo `test -f 'zmulma.c' || echo '$(srcdir)/'`zmulma.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/libMatrixMultiplication_la-zmulma.Tpo $(DEPDIR)/libMatrixMultiplication_la-zmulma.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='zmulma.c' object='libMatrixMultiplication_la-zmulma.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) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -c -o libMatrixMultiplication_la-matrixMultiplication.lo `test -f 'matrixMultiplication.c' || echo '$(srcdir)/'`matrixMultiplication.c +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libMatrixMultiplication_la_CFLAGS) $(CFLAGS) -c -o libMatrixMultiplication_la-zmulma.lo `test -f 'zmulma.c' || echo '$(srcdir)/'`zmulma.c testMatrixMultiplication-testFloatMatrixMultiplication.o: testFloatMatrixMultiplication.c @am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testMatrixMultiplication_CFLAGS) $(CFLAGS) -MT testMatrixMultiplication-testFloatMatrixMultiplication.o -MD -MP -MF $(DEPDIR)/testMatrixMultiplication-testFloatMatrixMultiplication.Tpo -c -o testMatrixMultiplication-testFloatMatrixMultiplication.o `test -f 'testFloatMatrixMultiplication.c' || echo '$(srcdir)/'`testFloatMatrixMultiplication.c diff --git a/src/matrixOperations/multiplication/cmulma.c b/src/matrixOperations/multiplication/cmulma.c new file mode 100644 index 00000000..58742d99 --- /dev/null +++ b/src/matrixOperations/multiplication/cmulma.c @@ -0,0 +1,44 @@ +/* + * 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 "matrixMultiplication.h" + +/* +** \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) + { + accu = cadds(accu, + ctimess(in1[i % lines1 + k *lines1] , + in2[k + (i / lines1) *lines2] )); + } + out[i] = accu; + } +} diff --git a/src/matrixOperations/multiplication/dmulma.c b/src/matrixOperations/multiplication/dmulma.c new file mode 100644 index 00000000..8c20960a --- /dev/null +++ b/src/matrixOperations/multiplication/dmulma.c @@ -0,0 +1,67 @@ +/* + * 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 WITHOUT_BLAS +#include "blas.h" +#endif +#include "matrixMultiplication.h" + +/* +** \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) +{ +#ifndef WITHOUT_BLAS + /* + ** USES BLAS DGEMM FUNCTION. + */ + 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); +#else + /* + ** DO NOT USE ANY BLAS FUNCTION. + */ + int i = 0; + int k = 0; + double accu = 0; + + /* + ** How to convert 2 index matrixes to one. + ** #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 * lines1] + * in2[k + (i / lines1) * lines2]; + } + out[i] = accu; + } +#endif +} diff --git a/src/matrixOperations/multiplication/smulma.c b/src/matrixOperations/multiplication/smulma.c index dbed4330..edf10a01 100644 --- a/src/matrixOperations/multiplication/smulma.c +++ b/src/matrixOperations/multiplication/smulma.c @@ -10,9 +10,6 @@ * */ -#ifndef WITHOUT_BLAS -#include "blas.h" -#endif #include "matrixMultiplication.h" /* @@ -49,173 +46,4 @@ void smulma(float *in1, int lines1, int columns1, } 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) -{ -#ifndef WITHOUT_BLAS - /* - ** USES BLAS DGEMM FUNCTION. - */ - 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); -#else - /* - ** DO NOT USE ANY BLAS FUNCTION. - */ - int i = 0; - int k = 0; - double accu = 0; - - /* - ** How to convert 2 index matrixes to one. - ** #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 * lines1] - * in2[k + (i / lines1) * lines2]; - } - out[i] = accu; - } -#endif -} - -/* -** \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) - { - accu = cadds(accu, - ctimess(in1[i % lines1 + k *lines1] , - in2[k + (i / lines1) *lines2] )); - } - 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) -{ -#ifndef WITHOUT_BLAS - /* - ** USES BLAS DGEMM FUNCTION. - */ - int i = 0; - 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); - - /* Now fill output matrix */ - for(i = 0 ; i < lines1 * columns2 ; ++i) - { - out[i] = DoubleComplex(RealOut[i], ImagOut[i]); - } - /* FREE allocated variables */ - free(in1Real); - free(in2Real); - free(in1Imag); - free(in2Imag); - free(RealOut); - free(ImagOut); -#else - /* - ** DO NOT USE ANY BLAS FUNCTION. - */ - int i = 0; - int k = 0; - doubleComplex accu = DoubleComplex(0, 0); - - for (i = 0 ; i < lines1 * columns2 ; ++i) - { - accu = DoubleComplex(0,0); - for (k = 0; k < columns1 ; ++k) - { - accu = zadds(accu, - ztimess(in1[i % lines1 + k *lines1] , - in2[k + (i / lines1) *lines2] )); - } - out[i] = accu; - } -#endif } diff --git a/src/matrixOperations/multiplication/zmulma.c b/src/matrixOperations/multiplication/zmulma.c new file mode 100644 index 00000000..30147c75 --- /dev/null +++ b/src/matrixOperations/multiplication/zmulma.c @@ -0,0 +1,102 @@ +/* + * 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 WITHOUT_BLAS +#include "blas.h" +#endif +#include "matrixMultiplication.h" + +/* +** \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) +{ +#ifndef WITHOUT_BLAS + /* + ** USES BLAS DGEMM FUNCTION. + */ + int i = 0; + 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); + + /* Now fill output matrix */ + for(i = 0 ; i < lines1 * columns2 ; ++i) + { + out[i] = DoubleComplex(RealOut[i], ImagOut[i]); + } + /* FREE allocated variables */ + free(in1Real); + free(in2Real); + free(in1Imag); + free(in2Imag); + free(RealOut); + free(ImagOut); +#else + /* + ** DO NOT USE ANY BLAS FUNCTION. + */ + int i = 0; + int k = 0; + doubleComplex accu = DoubleComplex(0, 0); + + for (i = 0 ; i < lines1 * columns2 ; ++i) + { + accu = DoubleComplex(0,0); + for (k = 0; k < columns1 ; ++k) + { + accu = zadds(accu, + ztimess(in1[i % lines1 + k *lines1] , + in2[k + (i / lines1) *lines2] )); + } + out[i] = accu; + } +#endif +} |