This commit is contained in:
Pascal Serrarens 2025-07-03 13:06:46 +02:00
parent c3fa3d5957
commit 205dbeb877
2 changed files with 49 additions and 21 deletions

View File

@ -27,6 +27,18 @@ Matrix1::Matrix1(float* data, int size) : data(data), size(size) {
this->externalData = true; this->externalData = true;
} }
int Matrix1::Size() const {
return this->size;
}
Matrix1 Matrix1::FromVector3(Vector3 v) {
Matrix1 r(3);
r.data[0] = v.x;
r.data[1] = v.y;
r.data[2] = v.z;
return r;
}
Vector3 Matrix1::ToVector3() { Vector3 Matrix1::ToVector3() {
return Vector3(this->data[0], this->data[1], this->data[2]); return Vector3(this->data[0], this->data[1], this->data[2]);
} }
@ -174,7 +186,8 @@ Matrix2 Matrix2::Clone() const {
// nCols(other.nCols), // nCols(other.nCols),
// nValues(other.nValues), // nValues(other.nValues),
// data(other.data) { // data(other.data) {
// other.data = nullptr; // Set the other object's pointer to nullptr to avoid // other.data = nullptr; // Set the other object's pointer to nullptr to
// avoid
// // double deletion // // double deletion
// } // }
@ -275,7 +288,17 @@ Matrix2 Matrix2::operator-(const Matrix2& v) const {
return r; return r;
} }
Matrix2 LinearAlgebra::Matrix2::operator*(const Matrix2& B) const { Matrix1 operator*(const Matrix2& m, const Matrix1& v) {
Matrix1 r = Matrix1(m.nRows);
for (int rowIx = 0; rowIx < m.nRows; rowIx++) {
int mRowIx = rowIx * m.nCols;
for (int colIx = 0; colIx < m.nCols; colIx++)
r(rowIx) += m.data[mRowIx + colIx] * v(rowIx);
}
return r;
}
Matrix2 Matrix2::operator*(const Matrix2& B) const {
Matrix2 r = Matrix2(this->nRows, B.nCols); Matrix2 r = Matrix2(this->nRows, B.nCols);
int ACols = this->nCols; int ACols = this->nCols;
@ -306,7 +329,7 @@ Matrix2 LinearAlgebra::Matrix2::operator*(const Matrix2& B) const {
Matrix2 Matrix2::GetRows(int from, int to) { Matrix2 Matrix2::GetRows(int from, int to) {
if (from < 0 || to >= this->nRows) if (from < 0 || to >= this->nRows)
std::cerr << "Slice index out of range." << "std::endl"; std::cerr << "Slice index out of range." << std::endl;
Matrix2 result = Matrix2(to - from, this->nCols); Matrix2 result = Matrix2(to - from, this->nCols);
int resultRowIx = 0; int resultRowIx = 0;
@ -330,8 +353,8 @@ Vector3 Matrix2::GetRow3(int rowIx) {
void Matrix2::SetRow(int rowIx, Matrix1 source) { void Matrix2::SetRow(int rowIx, Matrix1 source) {
int cellIx = rowIx * this->nCols; int cellIx = rowIx * this->nCols;
for (int ix = 0; ix < source.size; ix++) for (int ix = 0; ix < source.Size(); ix++)
this->data[cellIx + ix] = source.data[ix]; this->data[cellIx + ix] = source(ix);
} }
void Matrix2::SetRow3(int rowIx, Vector3 v) { void Matrix2::SetRow3(int rowIx, Vector3 v) {

View File

@ -9,13 +9,13 @@ namespace LinearAlgebra {
/// @brief A 1-dimensional matrix or vector of arbitrary size /// @brief A 1-dimensional matrix or vector of arbitrary size
class Matrix1 { class Matrix1 {
public: public:
float* data = nullptr;
int size = 0;
Matrix1(); Matrix1();
Matrix1(int size); Matrix1(int size);
Matrix1(float* data, int size); Matrix1(float* data, int size);
int Size() const;
static Matrix1 FromVector3(Vector3 v);
Vector3 ToVector3(); Vector3 ToVector3();
static Matrix1 FromQuaternion(Quaternion q); static Matrix1 FromQuaternion(Quaternion q);
@ -45,6 +45,10 @@ class Matrix1 {
this->data[ix] = source.data[sourceIx]; this->data[ix] = source.data[sourceIx];
} }
protected:
float* data = nullptr;
int size = 0;
private: private:
bool externalData = true; bool externalData = true;
}; };
@ -105,15 +109,16 @@ class Matrix2 {
return r; return r;
} }
friend Matrix1 operator*(const Matrix2& m, const Matrix1& v) { friend Matrix1 operator*(const Matrix2& m, const Matrix1& v);
Matrix1 r = Matrix1(m.nRows); // {
for (int rowIx = 0; rowIx < m.nRows; rowIx++) { // Matrix1 r = Matrix1(m.nRows);
int mRowIx = rowIx * m.nCols; // for (int rowIx = 0; rowIx < m.nRows; rowIx++) {
for (int colIx = 0; colIx < m.nCols; colIx++) // int mRowIx = rowIx * m.nCols;
r.data[rowIx] += m.data[mRowIx + colIx] * v.data[rowIx]; // for (int colIx = 0; colIx < m.nCols; colIx++)
} // r.data[rowIx] += m.data[mRowIx + colIx] * v.data[rowIx];
return r; // }
} // return r;
// }
friend Matrix2 operator/(const Matrix2& m, float f) { friend Matrix2 operator/(const Matrix2& m, float f) {
Matrix2 r = Matrix2(m.nRows, m.nCols); Matrix2 r = Matrix2(m.nRows, m.nCols);