46 DoubleMatrix(
unsigned int rows,
unsigned int cols,
bool isinternal =
false ) {
47 shData =
new sharedData();
48 shData->refcounts = 1;
51 shData->tsize = rows*cols;
52 shData->temporary =
false;
53 shData->alldata =
new double[ shData->tsize ];
54 shData->alldataref =
new doubleRef[ shData->tsize ];
57 for(
unsigned int i=0; i<rows; i++ ) {
59 shData->rowdata[i].resizeNoData( cols );
61 for(
unsigned int i=0; i<cols; i++ ) {
63 shData->coldata[i].resizeNoData( rows );
65 for(
unsigned int t=0; t<shData->tsize; t++ ) {
66 unsigned int r = t/cols;
67 unsigned int c = t%cols;
68 shData->rowdata[r].shData->dataref[c].setRef( shData->alldata + t );
69 shData->coldata[c].shData->dataref[r].setRef( shData->alldata + t );
70 shData->alldataref[t].setRef( shData->alldata + t );
72 this->isinternal = isinternal;
79 shData->temporary =
false;
111 DoubleMatrix(
unsigned int rows,
unsigned int cols,
bool temp,
unsigned int dummy ) {
113 shData =
new sharedData();
114 shData->refcounts = 1;
115 shData->nrows = rows;
116 shData->ncols = cols;
117 shData->tsize = rows*cols;
118 shData->temporary = temp;
119 shData->alldata =
new double[ shData->tsize ];
120 shData->alldataref =
new doubleRef[ shData->tsize ];
123 for(
unsigned int i=0; i<rows; i++ ) {
125 shData->rowdata[i].resizeNoData( cols );
127 for(
unsigned int i=0; i<cols; i++ ) {
129 shData->coldata[i].resizeNoData( rows );
131 for(
unsigned int t=0; t<shData->tsize; t++ ) {
132 unsigned int r = t/cols;
133 unsigned int c = t%cols;
134 shData->rowdata[r].shData->dataref[c].setRef( shData->alldata + t );
135 shData->coldata[c].shData->dataref[r].setRef( shData->alldata + t );
136 shData->alldataref[t].setRef( shData->alldata + t );
138 this->isinternal =
false;
142 shData->refcounts -= 1;
143 if ( shData->refcounts == 0 ) {
145 if ( shData->tsize > 0 ) {
146 delete [](shData->rowdata);
147 delete [](shData->coldata);
148 delete [](shData->alldataref);
149 delete [](shData->alldata);
156 return shData->nrows;
160 return shData->ncols;
164 return shData->tsize;
168 if ( shData == right.shData )
return true;
169 if ( shData->tsize != right.shData->tsize )
return false;
170 if ( shData->nrows != right.shData->nrows )
return false;
171 if ( shData->ncols != right.shData->ncols )
return false;
172 for(
unsigned int i=0; i<shData->tsize; i++ ) {
173 if ( shData->alldata[i] != right.shData->alldata[i] )
return false;
179 return !( *
this == right );
200 if ( shData == src.shData )
return (*
this);
202 shData->refcounts -= 1;
203 if ( shData->refcounts == 0 ) {
205 if ( shData->tsize > 0 ) {
206 delete [](shData->rowdata);
207 delete [](shData->coldata);
208 delete [](shData->alldata);
216 shData->temporary =
false;
227 if ( shData == src.shData )
return (*
this);
229 unsigned int rowMax = qMin( shData->nrows, src.shData->nrows );
230 unsigned int colMax = qMin( shData->ncols, src.shData->ncols );
231 for(
unsigned int r=0; r<rowMax; r++ ) {
232 for(
unsigned int c=0; c<colMax; c++ ) {
233 shData->rowdata[r][c] = src.shData->rowdata[r][c];
249 if ( shData == src.shData && srcRowOffset == 0 && srcColOffset == 0 && thisRowOffset == 0 && thisColOffset == 0 ) {
253 unsigned int rowMax = qMin( shData->nrows-thisRowOffset, src.shData->nrows-srcRowOffset );
254 unsigned int colMax = qMin( shData->ncols-thisColOffset, src.shData->ncols-thisColOffset );
255 for(
unsigned int r=0; r<rowMax; r++ ) {
256 for(
unsigned int c=0; c<colMax; c++ ) {
257 shData->rowdata[r+thisRowOffset][c+thisColOffset] = src.shData->rowdata[r+srcRowOffset][c+srcColOffset];
275 DoubleMatrix&
copyValues(
const DoubleMatrix& src,
unsigned int srcRowOffset,
unsigned int srcColOffset,
unsigned int thisRowOffset,
unsigned int thisColOffset,
unsigned int rowStride,
unsigned int colStride ) {
276 if ( rowStride == 0 || colStride == 0 )
return (*
this);
278 if ( shData == src.shData && srcRowOffset == 0 && srcColOffset == 0 && thisRowOffset == 0 && thisColOffset == 0 ) {
282 unsigned int rowMax = qMin( shData->nrows-thisRowOffset, src.shData->nrows-srcRowOffset );
283 unsigned int colMax = qMin( shData->ncols-thisColOffset, src.shData->ncols-thisColOffset );
284 for(
unsigned int r=0; r<rowMax; r=r+rowStride ) {
285 for(
unsigned int c=0; c<colMax; c=c+colStride ) {
286 shData->rowdata[r+thisRowOffset][c+thisColOffset] = src.shData->rowdata[r+srcRowOffset][c+srcColOffset];
295 if ( shData->refcounts > 1 ) {
296 sharedData* tmp =
new sharedData();
298 tmp->nrows = shData->nrows;
299 tmp->ncols = shData->ncols;
300 tmp->tsize = shData->tsize;
301 tmp->temporary =
false;
302 tmp->alldata =
new double[shData->tsize];
305 for(
unsigned int i=0; i<shData->nrows; i++ ) {
306 tmp->rowdata[i].resizeNoData( shData->ncols );
308 for(
unsigned int i=0; i<shData->ncols; i++ ) {
309 tmp->coldata[i].resizeNoData( shData->nrows );
311 for(
unsigned int t=0; t<tmp->tsize; t++ ) {
312 unsigned int r = t/( tmp->ncols );
313 unsigned int c = t%( tmp->ncols );
314 tmp->rowdata[r].shData->dataref[c].setRef( tmp->alldata + t );
315 tmp->coldata[c].shData->dataref[r].setRef( tmp->alldata + t );
327 if ( row >= shData->nrows )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Row boundary of matrix");
328 if ( col >= shData->ncols )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Column boundary of matrix");
331 return shData->rowdata[row][col];
336 double at(
unsigned int row,
unsigned int col )
const {
338 if ( row >= shData->nrows )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Row boundary of matrix");
339 if ( col >= shData->ncols )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Column boundary of matrix");
341 return shData->rowdata[row][col];
348 if ( row >= shData->nrows )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Row boundary of matrix");
351 return shData->rowdata[row];
358 if ( row >= shData->nrows )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Row boundary of matrix");
360 return shData->rowdata[row];
368 return shData->rowdata[r];
375 return shData->rowdata[r];
380 if ( c >= shData->ncols )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Column boundary of matrix");
383 return shData->coldata[c];
388 if ( c >= shData->ncols )
throw OutsideMatrixBoundaries(
"Accessing an element beyond Column boundary of matrix");
390 return shData->coldata[c];
398 if( i >= shData->nrows || j >= shData->ncols )
throw OutsideMatrixBoundaries(
"Fixating elements outside boundary");
401 shData->rowdata[i].steady(j);
402 shData->coldata[j].steady(i);
403 shData->alldataref[ i*shData->ncols + j ].setSteady();
411 if( i >= shData->nrows || j >= shData->ncols )
throw OutsideMatrixBoundaries(
"Un-Fixating elements outside boundary");
414 shData->rowdata[i].unsteady(j);
415 shData->coldata[j].unsteady(i);
416 shData->alldataref[ i*shData->ncols + j ].setNoSteady();
420 bool isSteady(
unsigned int i,
unsigned int j )
const {
422 if( i >= shData->nrows || j >= shData->ncols )
throw OutsideMatrixBoundaries(
"Accessing elements outside boundary");
424 return shData->rowdata[i].isSteady(j);
431 for(
unsigned int i=0; i<shData->tsize; i++ ) {
432 shData->alldataref[i] = value;
441 for(
unsigned int r=0; r<shData->nrows; r++ ) {
442 for(
unsigned int c=0; c<shData->ncols; c++ ) {
443 shData->rowdata[r][c] = (r==c);
453 for(
unsigned int i=0; i<shData->tsize; i++ ) {
454 shData->alldataref[i] = 0;
463 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
467 if ( right.shData->temporary ) {
468 for(
unsigned int i=0; i<shData->tsize; i++ ) {
469 right.shData->alldataref[i] = shData->alldata[i] + right.shData->alldata[i];
472 }
else if ( shData->temporary ) {
473 for(
unsigned int i=0; i<shData->tsize; i++ ) {
474 shData->alldataref[i] = shData->alldata[i] + right.shData->alldata[i];
478 DoubleMatrix ret( shData->nrows, shData->ncols,
true, 0 );
479 for(
unsigned int i=0; i<shData->tsize; i++ ) {
480 ret.shData->alldataref[i] = shData->alldata[i] + right.shData->alldata[i];
490 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
494 if ( right.shData->temporary ) {
495 for(
unsigned int i=0; i<shData->tsize; i++ ) {
496 right.shData->alldataref[i] = shData->alldata[i] - right.shData->alldata[i];
499 }
else if ( shData->temporary ) {
500 for(
unsigned int i=0; i<shData->tsize; i++ ) {
501 shData->alldataref[i] = shData->alldata[i] - right.shData->alldata[i];
505 DoubleMatrix ret( shData->nrows, shData->ncols,
true, 0 );
506 for(
unsigned int i=0; i<shData->tsize; i++ ) {
507 ret.shData->alldataref[i] = shData->alldata[i] - right.shData->alldata[i];
518 if ( shData->ncols != right.shData->nrows ) {
519 throw IncompatibleMatrices(
"Incompatibles Matrices in operator* (left matrix column dimension must be equal to right matrix row dimension)");
523 DoubleMatrix ret( shData->nrows, right.shData->ncols,
true, 0 );
525 for(
unsigned int i=0; i<ret.shData->nrows; i++ ) {
526 for(
unsigned int j=0; j<ret.shData->ncols; j++ ) {
527 for(
unsigned int r=0; r<shData->ncols; r++ ) {
528 ret.shData->rowdata[i][j] += shData->rowdata[i][r] * right.shData->rowdata[r][j];
539 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
543 if ( right.shData->temporary ) {
544 for(
unsigned int i=0; i<shData->tsize; i++ ) {
545 right.shData->alldataref[i] = shData->alldata[i] * right.shData->alldata[i];
548 }
else if ( shData->temporary ) {
549 for(
unsigned int i=0; i<shData->tsize; i++ ) {
550 shData->alldataref[i] = shData->alldata[i] * right.shData->alldata[i];
554 DoubleMatrix ret( shData->nrows, shData->ncols,
true, 0 );
555 for(
unsigned int i=0; i<shData->tsize; i++ ) {
556 ret.shData->alldataref[i] = shData->alldata[i] * right.shData->alldata[i];
566 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
570 if ( right.shData->temporary ) {
571 for(
unsigned int i=0; i<shData->tsize; i++ ) {
572 right.shData->alldataref[i] = shData->alldata[i] / right.shData->alldata[i];
575 }
else if ( shData->temporary ) {
576 for(
unsigned int i=0; i<shData->tsize; i++ ) {
577 shData->alldataref[i] = shData->alldata[i] / right.shData->alldata[i];
581 DoubleMatrix ret( shData->nrows, shData->ncols,
true, 0 );
582 for(
unsigned int i=0; i<shData->tsize; i++ ) {
583 ret.shData->alldataref[i] = shData->alldata[i] / right.shData->alldata[i];
593 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
598 for(
unsigned int i=0; i<shData->tsize; i++ ) {
599 shData->alldataref[i] += right.shData->alldata[i];
608 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
613 for(
unsigned int i=0; i<shData->tsize; i++ ) {
614 shData->alldataref[i] -= right.shData->alldata[i];
623 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
628 for(
unsigned int i=0; i<shData->tsize; i++ ) {
629 shData->alldataref[i] *= right.shData->alldata[i];
638 if ( shData->tsize != right.shData->tsize || shData->nrows != right.shData->nrows || shData->ncols != right.shData->ncols ) {
643 for(
unsigned int i=0; i<shData->tsize; i++ ) {
644 shData->alldataref[i] /= right.shData->alldata[i];