29template <
typename ElementType>
32 Matrix result (size, size);
34 for (
size_t i = 0; i < size; ++i)
40template <
typename ElementType>
44 jassert (size <= vector.rows);
46 Matrix result (size, size);
48 for (
size_t i = 0; i < size; ++i)
49 result (i, i) = vector (0, 0);
51 for (
size_t i = 1; i < size; ++i)
52 for (
size_t j = i; j < size; ++j)
53 result (j, j - i) = result (j - i, j) = vector (i, 0);
58template <
typename ElementType>
62 jassert (vector.rows >= (2 * (size - 1) + 1));
64 Matrix result (size, size);
66 for (
size_t i = 0; i < size; ++i)
67 result (i, i) = vector ((2 * i) + offset, 0);
69 for (
size_t i = 1; i < size; ++i)
70 for (
size_t j = i; j < size; ++j)
71 result (j, j - i) = result (j - i, j) = vector (i + 2 * (j - i) + offset, 0);
77template <
typename ElementType>
80 jassert (columnOne < columns && columnTwo < columns);
82 auto* p = data.getRawDataPointer();
84 for (
size_t i = 0; i < rows; ++i)
86 auto offset = dataAcceleration.getUnchecked (
static_cast<int> (i));
87 std::swap (p[offset + columnOne], p[offset + columnTwo]);
93template <
typename ElementType>
96 jassert (rowOne < rows && rowTwo < rows);
98 auto offset1 = rowOne * columns;
99 auto offset2 = rowTwo * columns;
101 auto* p = data.getRawDataPointer();
103 for (
size_t i = 0; i < columns; ++i)
104 std::swap (p[offset1 + i], p[offset2 + i]);
110template <
typename ElementType>
113 auto n = getNumRows(), m = other.getNumColumns(), p = getNumColumns();
116 jassert (p == other.getNumRows());
118 size_t offsetMat = 0, offsetlhs = 0;
121 auto* a = getRawDataPointer();
122 auto* b = other.getRawDataPointer();
124 for (
size_t i = 0; i < n; ++i)
126 size_t offsetrhs = 0;
128 for (
size_t k = 0; k < p; ++k)
130 auto ak = a[offsetlhs++];
132 for (
size_t j = 0; j < m; ++j)
133 dst[offsetMat + j] += ak * b[offsetrhs + j];
145template <
typename ElementType>
148 if (a.rows != b.rows || a.columns != b.columns)
151 tolerance = std::abs (tolerance);
153 auto* bPtr = b.begin();
154 for (
auto aValue : a)
155 if (std::abs (aValue - *bPtr++) > tolerance)
162template <
typename ElementType>
166 jassert (n == n && n == b.rows && b.isOneColumnVector());
168 auto* x = b.getRawDataPointer();
169 const auto& A = *
this;
175 auto denominator = A (0,0);
177 if (approximatelyEqual (denominator, (ElementType) 0))
180 b (0, 0) /= denominator;
186 auto denominator = A (0, 0) * A (1, 1) - A (0, 1) * A (1, 0);
188 if (approximatelyEqual (denominator, (ElementType) 0))
191 auto factor = (1 / denominator);
192 auto b0 = x[0], b1 = x[1];
194 x[0] = factor * (A (1, 1) * b0 - A (0, 1) * b1);
195 x[1] = factor * (A (0, 0) * b1 - A (1, 0) * b0);
201 auto denominator = A (0, 0) * (A (1, 1) * A (2, 2) - A (1, 2) * A (2, 1))
202 + A (0, 1) * (A (1, 2) * A (2, 0) - A (1, 0) * A (2, 2))
203 + A (0, 2) * (A (1, 0) * A (2, 1) - A (1, 1) * A (2, 0));
205 if (approximatelyEqual (denominator, (ElementType) 0))
208 auto factor = 1 / denominator;
209 auto b0 = x[0], b1 = x[1], b2 = x[2];
211 x[0] = ( ( A (0, 1) * A (1, 2) - A (0, 2) * A (1, 1)) * b2
212 + (-A (0, 1) * A (2, 2) + A (0, 2) * A (2, 1)) * b1
213 + ( A (1, 1) * A (2, 2) - A (1, 2) * A (2, 1)) * b0) * factor;
215 x[1] = -( ( A (0, 0) * A (1, 2) - A (0, 2) * A (1, 0)) * b2
216 + (-A (0, 0) * A (2, 2) + A (0, 2) * A (2, 0)) * b1
217 + ( A (1, 0) * A (2, 2) - A (1, 2) * A (2, 0)) * b0) * factor;
219 x[2] = ( ( A (0, 0) * A (1, 1) - A (0, 1) * A (1, 0)) * b2
220 + (-A (0, 0) * A (2, 1) + A (0, 1) * A (2, 0)) * b1
221 + ( A (1, 0) * A (2, 1) - A (1, 1) * A (2, 0)) * b0) * factor;
230 for (
size_t j = 0; j < n; ++j)
232 if (approximatelyEqual (M (j, j), (ElementType) 0))
235 while (i < n && approximatelyEqual (M (i, j), (ElementType) 0))
241 for (
size_t k = 0; k < n; ++k)
242 M (j, k) += M (i, k);
247 auto t = 1 / M (j, j);
249 for (
size_t k = 0; k < n; ++k)
254 for (
size_t k = j + 1; k < n; ++k)
258 for (
size_t l = 0; l < n; ++l)
259 M (k, l) += u * M (j, l);
265 for (
int k =
static_cast<int> (n) - 2; k >= 0; --k)
266 for (
size_t i =
static_cast<size_t> (k) + 1; i < n; ++i)
267 x[k] -= M (
static_cast<size_t> (k), i) * x[i];
275template <
typename ElementType>
281 auto* p = data.
begin();
283 for (
size_t i = 0; i < rows; ++i)
285 for (
size_t j = 0; j < columns; ++j)
288 sizeMax = jmax (sizeMax, entry.
length());
294 sizeMax = ((sizeMax + 1) / 4 + 1) * 4;
298 auto n =
static_cast<size_t> (entries.
size());
300 for (
size_t i = 0; i < n; ++i)
302 result << entries[(int) i].paddedRight (
' ', sizeMax);
304 if (i % columns == (columns - 1))
int size() const noexcept
void add(String stringToAdd)
String * begin() noexcept
int length() const noexcept
Matrix & swapRows(size_t rowOne, size_t rowTwo) noexcept
static bool compare(const Matrix &a, const Matrix &b, ElementType tolerance=0) noexcept
bool isOneColumnVector() const noexcept
Matrix & swapColumns(size_t columnOne, size_t columnTwo) noexcept
static Matrix hankel(const Matrix &vector, size_t size, size_t offset=0)
Matrix operator*(ElementType scalar) const
static Matrix identity(size_t size)
bool solve(Matrix &b) const noexcept
static Matrix toeplitz(const Matrix &vector, size_t size)
ElementType * getRawDataPointer() noexcept