Skip to content

Commit 6f18f3b

Browse files
committed
Create apply_elementary_row_operations.cpp
1 parent ff774b8 commit 6f18f3b

File tree

1 file changed

+114
-0
lines changed

1 file changed

+114
-0
lines changed
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/**
2+
* @file apply_elementary_row_operations.cpp
3+
* @author Xuhua Huang
4+
* @brief Apply elementary row operations to a matrix and convert it to its reduced row echelon form (RREF).
5+
* @version 0.1
6+
* @date 2025-01-20
7+
*
8+
* @copyright Copyright (c) 2025
9+
*
10+
*/
11+
12+
#include <array>
13+
#include <iomanip>
14+
#include <iostream>
15+
16+
// Helper functions
17+
template<std::size_t M, std::size_t N>
18+
void swap_rows(std::array<std::array<double, N>, M>& matrix, std::size_t row1, std::size_t row2)
19+
{
20+
for (std::size_t i = 0; i < N; ++i)
21+
{
22+
std::swap(matrix[row1][i], matrix[row2][i]);
23+
}
24+
}
25+
26+
template<std::size_t M, std::size_t N>
27+
void scale_row(std::array<std::array<double, N>, M>& matrix, std::size_t row, double scale)
28+
{
29+
for (std::size_t i = 0; i < N; ++i)
30+
{
31+
matrix[row][i] *= scale;
32+
}
33+
}
34+
35+
template<std::size_t M, std::size_t N>
36+
void add_multiple_of_row(
37+
std::array<std::array<double, N>, M>& matrix, std::size_t target_row, std::size_t source_row, double scale
38+
)
39+
{
40+
for (std::size_t i = 0; i < N; ++i)
41+
{
42+
matrix[target_row][i] += matrix[source_row][i] * scale;
43+
}
44+
}
45+
46+
template<std::size_t M, std::size_t N>
47+
std::array<std::array<double, N>, M> to_rref(std::array<std::array<double, N>, M> matrix)
48+
{
49+
std::size_t lead = 0;
50+
51+
for (std::size_t r = 0; r < M; ++r)
52+
{
53+
if (lead >= N)
54+
{
55+
return matrix;
56+
}
57+
58+
std::size_t i = r;
59+
while (matrix[i][lead] == 0)
60+
{
61+
++i;
62+
if (i == M)
63+
{
64+
i = r;
65+
++lead;
66+
if (lead == N)
67+
{
68+
return matrix;
69+
}
70+
}
71+
}
72+
73+
swap_rows(matrix, i, r);
74+
75+
if (matrix[r][lead] != 0)
76+
{
77+
double scale = 1.0 / matrix[r][lead];
78+
scale_row(matrix, r, scale);
79+
}
80+
81+
for (std::size_t i = 0; i < M; ++i)
82+
{
83+
if (i != r)
84+
{
85+
double scale = -matrix[i][lead];
86+
add_multiple_of_row(matrix, i, r, scale);
87+
}
88+
}
89+
90+
++lead;
91+
}
92+
93+
return matrix;
94+
}
95+
96+
int main()
97+
{
98+
std::array<std::array<double, 4>, 3> matrix = {
99+
{{1, 2, -1, -4}, {2, 3, -1, -11}, {-2, 0, -3, 22}}
100+
};
101+
102+
auto rref_matrix = to_rref(matrix);
103+
104+
for (const auto& row : rref_matrix)
105+
{
106+
for (const auto& elem : row)
107+
{
108+
std::cout << std::setw(10) << elem << " ";
109+
}
110+
std::cout << std::endl;
111+
}
112+
113+
return 0;
114+
}

0 commit comments

Comments
 (0)