2 #define No_Standard_RangeError
3 #define No_Standard_OutOfRange
4 #define No_Standard_DimensionError
7 #include <math_Matrix.ixx>
8 #include <math_Vector.hxx>
10 #include <Standard_DimensionError.hxx>
11 #include <Standard_DivideByZero.hxx>
12 #include <Standard_RangeError.hxx>
13 #include <math_SingularMatrix.hxx>
14 #include <math_NotSquare.hxx>
15 #include <math_Gauss.hxx>
18 void math_Matrix::SetLowerRow(const Standard_Integer LowerRow) {
20 Array.SetLowerRow(LowerRow);
21 Standard_Integer Rows = RowNumber();
22 LowerRowIndex = LowerRow;
23 UpperRowIndex = LowerRowIndex + Rows - 1;
26 void math_Matrix::SetLowerCol(const Standard_Integer LowerCol) {
28 Array.SetLowerCol(LowerCol);
29 Standard_Integer Cols = ColNumber();
30 LowerColIndex = LowerCol;
31 UpperColIndex = LowerColIndex + Cols - 1;
34 math_Matrix::math_Matrix (const Standard_Integer LowerRow,
35 const Standard_Integer UpperRow,
36 const Standard_Integer LowerCol,
37 const Standard_Integer UpperCol):
39 LowerRowIndex(LowerRow),
40 UpperRowIndex(UpperRow),
41 LowerColIndex(LowerCol),
42 UpperColIndex(UpperCol),
43 Array(LowerRow, UpperRow,
47 Standard_RangeError_Raise_if((LowerRow > UpperRow) ||
48 (LowerCol > UpperCol), "");
51 math_Matrix::math_Matrix (const Standard_Integer LowerRow,
52 const Standard_Integer UpperRow,
53 const Standard_Integer LowerCol,
54 const Standard_Integer UpperCol,
55 const Standard_Real InitialValue):
57 LowerRowIndex(LowerRow),
58 UpperRowIndex(UpperRow),
59 LowerColIndex(LowerCol),
60 UpperColIndex(UpperCol),
61 Array(LowerRow, UpperRow,
65 Standard_RangeError_Raise_if((LowerRow > UpperRow) ||
66 (LowerCol > UpperCol), "");
67 Array.Init(InitialValue);
70 math_Matrix::math_Matrix (const Standard_Address Tab,
71 const Standard_Integer LowerRow,
72 const Standard_Integer UpperRow,
73 const Standard_Integer LowerCol,
74 const Standard_Integer UpperCol) :
76 LowerRowIndex(LowerRow),
77 UpperRowIndex(UpperRow),
78 LowerColIndex(LowerCol),
79 UpperColIndex(UpperCol),
80 Array(*((const Standard_Real *)Tab),
85 Standard_RangeError_Raise_if((LowerRow > UpperRow) ||
86 (LowerCol > UpperCol), "");
89 void math_Matrix::Init(const Standard_Real InitialValue)
91 Array.Init(InitialValue);
94 math_Matrix::math_Matrix (const math_Matrix& Other):
96 LowerRowIndex(Other.LowerRow()),
97 UpperRowIndex(Other.UpperRow()),
98 LowerColIndex(Other.LowerCol()),
99 UpperColIndex(Other.UpperCol()),
106 math_Matrix math_Matrix::Divided (const Standard_Real Right) const
108 Standard_DivideByZero_Raise_if(Abs(Right) <= RealEpsilon(), "");
109 math_Matrix temp = Multiplied(1./Right);
114 Standard_Real math_Matrix::Determinant() const
116 math_Gauss Sol(*this);
119 return Sol.Determinant();
126 void math_Matrix::Transpose()
128 math_NotSquare_Raise_if(RowNumber() != ColNumber(), "");
130 Standard_Integer Row = LowerRowIndex;
131 Standard_Integer Col = LowerColIndex;
132 SetLowerCol(LowerRowIndex);
134 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
135 for(Standard_Integer J = I; J <= UpperColIndex; J++) {
137 Array(I, J) = Array(J, I);
145 math_Matrix math_Matrix::Transposed() const
147 math_Matrix Result(LowerColIndex, UpperColIndex,
148 LowerRowIndex, UpperRowIndex);
150 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
151 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
152 Result.Array(J, I) = Array(I, J);
158 void math_Matrix::Invert()
160 math_NotSquare_Raise_if(RowNumber() != ColNumber(), "");
162 math_Gauss Sol(*this);
167 math_SingularMatrix::Raise(); // SingularMatrix Exception;
171 math_Matrix math_Matrix::Inverse() const
174 math_Matrix Result = *this;
179 void math_Matrix::Multiply (const Standard_Real Right)
181 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
182 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
183 Array(I, J) = Array(I, J) * Right;
188 math_Matrix math_Matrix::Multiplied (const Standard_Real Right) const
190 math_Matrix Result(LowerRowIndex, UpperRowIndex,
191 LowerColIndex, UpperColIndex);
192 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
193 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
194 Result.Array(I, J) = Array(I, J) * Right;
200 math_Matrix math_Matrix::TMultiplied (const Standard_Real Right) const
202 math_Matrix Result(LowerRowIndex, UpperRowIndex,
203 LowerColIndex, UpperColIndex);
204 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
205 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
206 Result.Array(I, J) = Array(I, J) * Right;
214 void math_Matrix::Divide (const Standard_Real Right)
216 Standard_DivideByZero_Raise_if(Abs(Right) <= RealEpsilon(), "");
218 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
219 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
220 Array(I, J) = Array(I, J) / Right;
225 void math_Matrix::Add (const math_Matrix& Right)
227 Standard_DimensionError_Raise_if((RowNumber() != Right.RowNumber()) ||
228 (ColNumber() != Right.ColNumber()),
231 Standard_Integer I2 = Right.LowerRowIndex;
232 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
233 Standard_Integer J2 = Right.LowerColIndex;
234 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
235 Array(I, J) = Array(I, J) + Right.Array(I2, J2);
242 void math_Matrix::Subtract (const math_Matrix& Right)
244 Standard_DimensionError_Raise_if((RowNumber() != Right.RowNumber()) ||
245 (ColNumber() != Right.ColNumber()),
248 Standard_Integer I2 = Right.LowerRowIndex;
249 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
250 Standard_Integer J2 = Right.LowerColIndex;
251 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
252 Array(I, J) = Array(I, J) - Right.Array(I2, J2);
259 void math_Matrix::Set(const Standard_Integer I1,const Standard_Integer I2,
260 const Standard_Integer J1,const Standard_Integer J2,
261 const math_Matrix& M)
264 Standard_DimensionError_Raise_if((I1 < LowerRowIndex) ||
265 (I2 > UpperRowIndex) ||
266 (J1 < LowerColIndex) ||
267 (J2 > UpperColIndex) ||
268 (I1 > I2) || (J1 > J2) ||
269 (I2-I1+1 != M.RowNumber()) ||
270 (J2-J1+1 != M.ColNumber()), "");
272 Standard_Integer II = M.LowerRow();
273 for(Standard_Integer I = I1; I <= I2; I++) {
274 Standard_Integer JJ = M.LowerCol();
275 for(Standard_Integer J = J1; J <= J2; J++) {
276 Array(I, J) = M.Array(II, JJ);
283 void math_Matrix::SetRow (const Standard_Integer Row,
284 const math_Vector& V)
287 Standard_RangeError_Raise_if((Row < LowerRowIndex) ||
288 (Row > UpperRowIndex) , "");
290 Standard_DimensionError_Raise_if(ColNumber() != V.Length(), "");
292 Standard_Integer I = V.LowerIndex;
293 for(Standard_Integer Index = LowerColIndex; Index <= UpperColIndex; Index++) {
294 Array(Row, Index) = V.Array(I);
299 void math_Matrix::SetCol (const Standard_Integer Col,
300 const math_Vector& V)
303 Standard_RangeError_Raise_if((Col < LowerColIndex) ||
304 (Col > UpperColIndex) , "");
306 Standard_DimensionError_Raise_if(RowNumber() != V.Length(), "");
308 Standard_Integer I = V.LowerIndex;
309 for(Standard_Integer Index = LowerRowIndex; Index <= UpperRowIndex; Index++) {
310 Array(Index, Col) = V.Array(I);
315 void math_Matrix::SetDiag(const Standard_Real Value)
318 math_NotSquare_Raise_if(RowNumber() != ColNumber(), "");
320 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
324 math_Vector math_Matrix::Row (const Standard_Integer Row) const
327 math_Vector Result(LowerColIndex, UpperColIndex);
329 for(Standard_Integer Index = LowerColIndex; Index <= UpperColIndex; Index++) {
330 Result.Array(Index) = Array(Row, Index);
335 math_Vector math_Matrix::Col (const Standard_Integer Col) const
338 math_Vector Result(LowerRowIndex, UpperRowIndex);
340 for(Standard_Integer Index = LowerRowIndex; Index <= UpperRowIndex; Index++) {
341 Result.Array(Index) = Array(Index, Col);
346 void math_Matrix::SwapRow(const Standard_Integer Row1,
347 const Standard_Integer Row2)
350 Standard_RangeError_Raise_if((Row1 < LowerRowIndex) ||
351 (Row1 > UpperRowIndex) ||
352 (Row2 < LowerRowIndex) ||
353 (Row2 > UpperRowIndex), "");
355 math_Vector V1 = Row(Row1);
356 math_Vector V2 = Row(Row2);
361 void math_Matrix::SwapCol(const Standard_Integer Col1,
362 const Standard_Integer Col2)
365 Standard_RangeError_Raise_if((Col1 < LowerColIndex) ||
366 (Col1 > UpperColIndex) ||
367 (Col2 < LowerColIndex) ||
368 (Col2 > UpperColIndex), "");
370 math_Vector V1 = Col(Col1);
371 math_Vector V2 = Col(Col2);
378 math_Matrix math_Matrix::Multiplied (const math_Matrix& Right) const
381 Standard_DimensionError_Raise_if(ColNumber() != Right.RowNumber(), "");
383 math_Matrix Result(LowerRowIndex, UpperRowIndex,
384 Right.LowerColIndex, Right.UpperColIndex);
387 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
388 for(Standard_Integer J2 = Right.LowerColIndex; J2 <= Right.UpperColIndex; J2++) {
390 Standard_Integer I2 = Right.LowerRowIndex;
391 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
392 Som = Som + Array(I, J) * Right.Array(I2, J2);
395 Result.Array(I, J2) = Som;
401 math_Matrix math_Matrix::TMultiply (const math_Matrix& Right) const
404 Standard_DimensionError_Raise_if(RowNumber() != Right.RowNumber(), "");
406 math_Matrix Result(LowerColIndex, UpperColIndex,
407 Right.LowerColIndex, Right.UpperColIndex);
410 for(Standard_Integer I = LowerColIndex; I <= UpperColIndex; I++) {
411 for(Standard_Integer J2 = Right.LowerColIndex; J2 <= Right.UpperColIndex; J2++) {
413 Standard_Integer I2 = Right.LowerRowIndex;
414 for(Standard_Integer J = LowerRowIndex; J <= UpperRowIndex; J++) {
415 Som = Som + Array(J, I) * Right.Array(I2, J2);
418 Result.Array(I, J2) = Som;
424 math_Matrix math_Matrix::Added (const math_Matrix& Right) const
427 Standard_DimensionError_Raise_if((RowNumber() != Right.RowNumber()) ||
428 (ColNumber() != Right.ColNumber()),
431 math_Matrix Result(LowerRowIndex, UpperRowIndex,
432 LowerColIndex, UpperColIndex);
434 Standard_Integer I2 = Right.LowerRowIndex;
435 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
436 Standard_Integer J2 = Right.LowerColIndex;
437 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
438 Result.Array(I, J) = Array(I, J) + Right.Array(I2, J2);
446 math_Matrix math_Matrix::Opposite ()
449 math_Matrix Result(LowerRowIndex, UpperRowIndex,
450 LowerColIndex, UpperColIndex);
452 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
453 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
454 Result.Array(I, J) = - Array(I, J);
460 math_Matrix math_Matrix::Subtracted (const math_Matrix& Right) const
463 Standard_DimensionError_Raise_if((RowNumber() != Right.RowNumber()) ||
464 (ColNumber() != Right.ColNumber()),
467 math_Matrix Result(LowerRowIndex, UpperRowIndex,
468 LowerColIndex, UpperColIndex);
470 Standard_Integer I2 = Right.LowerRowIndex;
471 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
472 Standard_Integer J2 = Right.LowerColIndex;
473 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
474 Result.Array(I, J) = Array(I, J) - Right.Array(I2, J2);
482 void math_Matrix::Multiply(const math_Vector& Left,
483 const math_Vector& Right)
486 Standard_DimensionError_Raise_if((RowNumber() != Left.Length()) ||
487 (ColNumber() != Right.Length()),
490 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
491 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
492 Array(I, J) = Left.Array(I) * Right.Array(J);
497 void math_Matrix::Multiply(const math_Matrix& Left,
498 const math_Matrix& Right)
501 Standard_DimensionError_Raise_if((Left.ColNumber() != Right.RowNumber()) ||
502 (RowNumber() != Left.RowNumber()) ||
503 (ColNumber() != Right.ColNumber()),
507 Standard_Integer I1 = Left.LowerRowIndex;
508 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
509 Standard_Integer J2 = Right.LowerColIndex;
510 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
512 Standard_Integer J1 = Left.LowerColIndex;
513 Standard_Integer I2 = Right.LowerRowIndex;
514 for(Standard_Integer K = Left.LowerColIndex; K <= Left.UpperColIndex; K++) {
515 Som = Som + Left.Array(I1, J1) * Right.Array(I2, J2);
526 void math_Matrix::TMultiply(const math_Matrix& TLeft,
527 const math_Matrix& Right)
530 Standard_DimensionError_Raise_if((TLeft.RowNumber() != Right.RowNumber()) ||
531 (RowNumber() != TLeft.ColNumber()) ||
532 (ColNumber() != Right.ColNumber()),
536 Standard_Integer I1 = TLeft.LowerColIndex;
537 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
538 Standard_Integer J2 = Right.LowerColIndex;
539 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
541 Standard_Integer J1 = TLeft.LowerRowIndex;
542 Standard_Integer I2 = Right.LowerRowIndex;
543 for(Standard_Integer K = TLeft.LowerRowIndex; K <= TLeft.UpperRowIndex; K++) {
544 Som = Som + TLeft.Array(J1, I1) * Right.Array(I2, J2);
555 void math_Matrix::Add (const math_Matrix& Left,
556 const math_Matrix& Right)
559 Standard_DimensionError_Raise_if((RowNumber() != Right.RowNumber()) ||
560 (ColNumber() != Right.ColNumber()) ||
561 (Right.RowNumber() != Left.RowNumber()) ||
562 (Right.ColNumber() != Left.ColNumber()),
565 Standard_Integer I1 = Left.LowerRowIndex;
566 Standard_Integer I2 = Right.LowerRowIndex;
567 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
568 Standard_Integer J1 = Left.LowerColIndex;
569 Standard_Integer J2 = Right.LowerColIndex;
570 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
571 Array(I, J) = Left.Array(I1, J1) + Right.Array(I2, J2);
580 void math_Matrix::Subtract(const math_Matrix& Left,
581 const math_Matrix& Right)
584 Standard_DimensionError_Raise_if((RowNumber() != Right.RowNumber()) ||
585 (ColNumber() != Right.ColNumber()) ||
586 (Right.RowNumber() != Left.RowNumber()) ||
587 (Right.ColNumber() != Left.ColNumber()),
590 Standard_Integer I1 = Left.LowerRowIndex;
591 Standard_Integer I2 = Right.LowerRowIndex;
592 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
593 Standard_Integer J1 = Left.LowerColIndex;
594 Standard_Integer J2 = Right.LowerColIndex;
595 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
596 Array(I, J) = Left.Array(I1, J1) - Right.Array(I2, J2);
606 void math_Matrix::Multiply(const math_Matrix& Right)
609 Standard_DimensionError_Raise_if(ColNumber() != Right.RowNumber(), "");
612 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
613 for(Standard_Integer J2 = Right.LowerColIndex; J2 <= Right.UpperColIndex; J2++) {
615 Standard_Integer I2 = Right.LowerRowIndex;
616 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
617 Som = Som + Array(I, J) * Right.Array(I2, J2);
627 math_Vector math_Matrix::Multiplied(const math_Vector& Right)const
630 Standard_DimensionError_Raise_if(ColNumber() != Right.Length(), "");
632 math_Vector Result(LowerRowIndex, UpperRowIndex);
634 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
635 Result.Array(I) = 0.0;
636 Standard_Integer II = Right.LowerIndex;
637 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
638 Result.Array(I) = Result.Array(I) + Array(I, J) * Right.Array(II);
645 math_Matrix& math_Matrix::Initialized(const math_Matrix& Other)
648 Standard_DimensionError_Raise_if((RowNumber() != Other.RowNumber()) ||
649 (ColNumber() != Other.ColNumber()), "");
651 (Other.Array).Copy(Array);
658 void math_Matrix::Dump(Standard_OStream& o)const
661 o << "math_Matrix of RowNumber = " << RowNumber();
662 o << " and ColNumber = " << ColNumber() << "\n";
664 for(Standard_Integer I = LowerRowIndex; I <= UpperRowIndex; I++) {
665 for(Standard_Integer J = LowerColIndex; J <= UpperColIndex; J++) {
666 o << "math_Matrix ( " << I << ", " << J << " ) = ";
667 o << Array(I, J) << "\n";