Compare commits

..

3 Commits

Author SHA1 Message Date
36cb3fb491 addtion/fix: added insert column and row 2026-04-29 11:02:05 -06:00
31256af24c addition: funtion for addign columns and rows 2026-04-28 17:37:00 -06:00
6757e85eaf addition: add row and column 2026-04-28 07:23:28 -06:00

View File

@@ -86,50 +86,50 @@ impl Matrix {
Ok((0..self.rows).map(move |i| &self.data[i * self.columns + i])) Ok((0..self.rows).map(move |i| &self.data[i * self.columns + i]))
} }
pub fn set(&mut self, row: usize, column: usize, data: Fraction) -> Option<MatrixError> { pub fn set(&mut self, row: usize, column: usize, data: Fraction) -> Result<(), MatrixError> {
if row >= self.rows || column >= self.columns { if row >= self.rows || column >= self.columns {
return Some(MatrixError::IndexOutOfRange); return Err(MatrixError::IndexOutOfRange);
} }
let mut index = 0; let mut index = 0;
index += row * self.columns; index += row * self.columns;
index += column; index += column;
self.data[index] = data; self.data[index] = data;
return None; Ok(())
} }
pub fn set_row(&mut self, row: usize, data: Vec<Fraction>) -> Option<MatrixError> { pub fn set_row(&mut self, row: usize, data: Vec<Fraction>) -> Result<(), MatrixError> {
if row >= self.rows { if row >= self.rows {
return Some(MatrixError::IndexOutOfRange); return Err(MatrixError::IndexOutOfRange);
} }
if data.len() != self.columns { if data.len() != self.columns {
return Some(MatrixError::InvalidDataSize); return Err(MatrixError::InvalidDataSize);
} }
for i in 0..data.len() { for i in 0..data.len() {
self.set(row, i, data[i]); self.set(row, i, data[i])?;
} }
None Ok(())
} }
pub fn set_column(&mut self, column: usize, data: Vec<Fraction>) -> Option<MatrixError> { pub fn set_column(&mut self, column: usize, data: Vec<Fraction>) -> Result<(), MatrixError> {
if column >= self.columns { if column >= self.columns {
return Some(MatrixError::ColumnOutOfRange); return Err(MatrixError::ColumnOutOfRange);
} }
if data.len() != self.rows { if data.len() != self.rows {
return Some(MatrixError::InvalidDataSize); return Err(MatrixError::InvalidDataSize);
} }
for i in 0..data.len() { for i in 0..data.len() {
self.set(i, column, data[i]); self.set(i, column, data[i])?;
} }
None Ok(())
} }
pub fn exchange_rows(&mut self, row1: usize, row2: usize) -> Option<MatrixError> { pub fn exchange_rows(&mut self, row1: usize, row2: usize) -> Result<(), MatrixError> {
if row1 >= self.rows || row2 >= self.rows { if row1 >= self.rows || row2 >= self.rows {
return Some(MatrixError::RowOutOfRange); return Err(MatrixError::RowOutOfRange);
} }
let start1 = row1 * self.columns; let start1 = row1 * self.columns;
@@ -139,12 +139,12 @@ impl Matrix {
self.data.swap(start1 + i, start2 + i); self.data.swap(start1 + i, start2 + i);
} }
None Ok(())
} }
pub fn exchange_columns(&mut self, column1: usize, column2: usize) -> Option<MatrixError> { pub fn exchange_columns(&mut self, column1: usize, column2: usize) -> Result<(), MatrixError> {
if column1 >= self.columns || column2 >= self.columns { if column1 >= self.columns || column2 >= self.columns {
return Some(MatrixError::ColumnOutOfRange); return Err(MatrixError::ColumnOutOfRange);
} }
for i in 0..self.rows { for i in 0..self.rows {
@@ -154,7 +154,43 @@ impl Matrix {
self.data.swap(idx1, idx2); self.data.swap(idx1, idx2);
} }
None Ok(())
}
pub fn insert_column(&mut self, index: usize, data: Vec<Fraction>) -> Result<(), MatrixError> {
if index >= self.columns {
return Err(MatrixError::ColumnOutOfRange);
}
if data.len() != self.rows {
return Err(MatrixError::InvalidDataSize);
}
for i in 0..self.rows {
self.data.insert((i * self.columns) + index + i, data[i]);
}
self.columns += 1;
Ok(())
}
pub fn insert_rows(&mut self, index: usize, data: Vec<Fraction>) -> Result<(), MatrixError> {
if index >= self.rows {
return Err(MatrixError::RowOutOfRange);
}
if data.len() != self.columns {
return Err(MatrixError::InvalidDataSize);
}
for i in 0..self.columns {
self.data.insert((i * self.columns) + i, data[i]);
}
self.rows += 1;
Ok(())
} }
fn partial_pivoting(&mut self, col: usize, sign: &mut Fraction) -> Result<bool, MatrixError> { fn partial_pivoting(&mut self, col: usize, sign: &mut Fraction) -> Result<bool, MatrixError> {
@@ -178,10 +214,7 @@ impl Matrix {
} }
if max_row != col { if max_row != col {
match self.exchange_rows(col, max_row) { self.exchange_rows(col, max_row)?;
Some(err) => return Err(err),
None => {}
};
*sign = -*sign; *sign = -*sign;
} }
@@ -221,7 +254,7 @@ impl Matrix {
.map(|(a, b)| *a - m * *b) .map(|(a, b)| *a - m * *b)
.collect::<Vec<Fraction>>(); .collect::<Vec<Fraction>>();
trig_matrix.set_row(x, new_row); trig_matrix.set_row(x, new_row)?;
} }
} }
@@ -251,7 +284,7 @@ impl Matrix {
.map(|x| *x / pivot) .map(|x| *x / pivot)
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;
new_matrix.set_row(i, new_pivot_row); new_matrix.set_row(i, new_pivot_row)?;
for r in 0..new_matrix.rows { for r in 0..new_matrix.rows {
if r == i { if r == i {
@@ -270,7 +303,7 @@ impl Matrix {
.map(|(a, b)| *a - factor * *b) .map(|(a, b)| *a - factor * *b)
.collect::<Vec<Fraction>>(); .collect::<Vec<Fraction>>();
new_matrix.set_row(r, new_row_normalized); new_matrix.set_row(r, new_row_normalized)?;
} }
} }