summaryrefslogtreecommitdiff
path: root/src/matrixOperations
diff options
context:
space:
mode:
Diffstat (limited to 'src/matrixOperations')
-rw-r--r--src/matrixOperations/Makefile.am31
-rw-r--r--src/matrixOperations/Makefile.in79
-rw-r--r--src/matrixOperations/matrixMultiplication.c153
-rw-r--r--src/matrixOperations/matrixMultiplication.h82
-rw-r--r--src/matrixOperations/testMatrixMultiplication.c224
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;
+}