NumCpp  2.1.0
A C++ implementation of the Python Numpy library
inv.hpp
Go to the documentation of this file.
1 #pragma once
30 
33 #include "NumCpp/Core/Shape.hpp"
34 #include "NumCpp/Core/Types.hpp"
35 #include "NumCpp/NdArray.hpp"
36 
37 #include <string>
38 
39 namespace nc
40 {
41  namespace linalg
42  {
43  //============================================================================
44  // Method Description:
54  template<typename dtype>
56  {
58 
59  const Shape inShape = inArray.shape();
60  if (inShape.rows != inShape.cols)
61  {
62  THROW_INVALID_ARGUMENT_ERROR("input array must be square.");
63  }
64 
65  const uint32 order = inShape.rows;
66 
67  Shape newShape(inShape);
68  newShape.rows *= 2;
69  newShape.cols *= 2;
70 
71  NdArray<double> tempArray(newShape);
72  for (uint32 row = 0; row < order; ++row)
73  {
74  for (uint32 col = 0; col < order; ++col)
75  {
76  tempArray(row, col) = static_cast<double>(inArray(row, col));
77  }
78  }
79 
80  for (uint32 row = 0; row < order; ++row)
81  {
82  for (uint32 col = order; col < 2 * order; ++col)
83  {
84  if (row == col - order)
85  {
86  tempArray(row, col) = 1.0;
87  }
88  else
89  {
90  tempArray(row, col) = 0.0;
91  }
92  }
93  }
94 
95  for (uint32 row = 0; row < order; ++row)
96  {
97  double t = tempArray(row, row);
98  for (uint32 col = row; col < 2 * order; ++col)
99  {
100  tempArray(row, col) /= t;
101  }
102 
103  for (uint32 col = 0; col < order; ++col)
104  {
105  if (row != col)
106  {
107  t = tempArray(col, row);
108  for (uint32 k = 0; k < 2 * order; ++k)
109  {
110  tempArray(col, k) -= t * tempArray(row, k);
111  }
112  }
113  }
114  }
115 
116  NdArray<double> returnArray(inShape);
117  for (uint32 row = 0; row < order; row++)
118  {
119  uint32 colCounter = 0;
120  for (uint32 col = order; col < 2 * order; ++col)
121  {
122  returnArray(row, colCounter++) = tempArray(row, col);
123  }
124  }
125 
126  return returnArray;
127  }
128  } // namespace linalg
129 } // namespace nc
StaticAsserts.hpp
nc::linalg::inv
NdArray< double > inv(const NdArray< dtype > &inArray)
Definition: inv.hpp:55
nc::NdArray::shape
Shape shape() const noexcept
Definition: NdArrayCore.hpp:4312
Error.hpp
STATIC_ASSERT_ARITHMETIC
#define STATIC_ASSERT_ARITHMETIC(dtype)
Definition: StaticAsserts.hpp:38
nc::NdArray< double >
nc::uint32
std::uint32_t uint32
Definition: Types.hpp:41
NdArray.hpp
nc::Shape
A Shape Class for NdArrays.
Definition: Core/Shape.hpp:41
nc::Shape::cols
uint32 cols
Definition: Core/Shape.hpp:46
Shape.hpp
nc
Definition: Coordinate.hpp:45
nc::Shape::rows
uint32 rows
Definition: Core/Shape.hpp:45
THROW_INVALID_ARGUMENT_ERROR
#define THROW_INVALID_ARGUMENT_ERROR(msg)
Definition: Error.hpp:37
Types.hpp