00001
00002
00003 #ifndef _DENSEMATRIX_H__
00004 #define _DENSEMATRIX_H__
00005
00006 #include "DenseMatrixArithmeticsNN.h"
00007
00008 DSS_NAMESPASE_BEGIN
00009
00010
00011
00012
00013 class DenseMatrix
00014 {
00015 public:
00016 long n;
00017 double* data;
00018
00019 private:
00020 DenseMatrixArithmetics* dma;
00021
00022 public:
00023 DenseMatrixArithmetics& DMA()
00024 {
00025 if (dma == NULL)
00026 dma = DenseMatrixArithmetics::NewArithmetics(n);
00027 return *dma;
00028 }
00029
00030
00031
00032
00033
00034
00035
00036 void Add(long i,long j, double val)
00037 {
00038 data[i+n*j] += val;
00039 }
00040
00041 DenseMatrix(long n)
00042 {
00043 dma = NULL;
00044 this->n = n;
00045 data = new double[n*n];
00046 memset(data,0,n*n*sizeof(double));
00047 }
00048
00049
00050 DenseMatrix(long n,double d)
00051 {
00052 dma = NULL;
00053 this->n = n;
00054 data = new double[n*n];
00055 for (long i=0; i<n; i++) data[i+i*n] = d;
00056 }
00057
00058 DenseMatrix(double* dataFrom,long start_idx,long n)
00059 {
00060 dma = NULL;
00061 this->n = n;
00062 data = new double[n*n];
00063 Array::Copy(dataFrom,start_idx,data,0,n*n);
00064 }
00065
00066 ~DenseMatrix()
00067 {
00068 if (dma)
00069 delete dma;
00070 if (data)
00071 delete [] data;
00072 }
00073
00074
00075
00076 void CopyTo(DenseMatrix& blockA,long bn)
00077 {
00078 Array::Copy(this->data,blockA.data,bn*bn);
00079 }
00080
00081 void CopyTo(double* dataTo,long start_idx)
00082 {
00083 Array::Copy(data,0,dataTo,start_idx,n*n);
00084 }
00085
00086 void Clear()
00087 {
00088 Array::Clear(data,0,n*n);
00089 }
00090
00091 static double InnerProduct(double *dp1,double *dp2,long len)
00092 {
00093 long i,len4;
00094 double sum0, sum1, sum2, sum3;
00095
00096 sum0 = sum1 = sum2 = sum3 = 0.0;
00097
00098 len4 = len / 4;
00099 len = len % 4;
00100
00101 for ( i = 0; i < len4; i++ )
00102 {
00103 sum0 += dp1[4*i]*dp2[4*i];
00104 sum1 += dp1[4*i+1]*dp2[4*i+1];
00105 sum2 += dp1[4*i+2]*dp2[4*i+2];
00106 sum3 += dp1[4*i+3]*dp2[4*i+3];
00107 }
00108 sum0 += sum1 + sum2 + sum3;
00109 dp1 += 4*len4; dp2 += 4*len4;
00110
00111 for ( i = 0; i < len; i++ )
00112 sum0 += (*dp1++)*(*dp2++);
00113
00114 return sum0;
00115 }
00116
00117 };
00118
00119 DSS_NAMESPASE_END
00120
00121 #endif //_DENSEMATRIX_H__