diff --git a/poincare/include/poincare/expression_matrix.h b/poincare/include/poincare/expression_matrix.h index 0cd1ca73c..d2b66a0ce 100644 --- a/poincare/include/poincare/expression_matrix.h +++ b/poincare/include/poincare/expression_matrix.h @@ -8,7 +8,7 @@ namespace Poincare { class ExpressionMatrix : public Matrix { public: ExpressionMatrix(MatrixData * matrixData); - ExpressionMatrix(Expression ** newOperands, int numberOfOperands, int m_numberOfColumns, int m_numberOfRows, bool cloneOperands); + ExpressionMatrix(Expression ** newOperands, int numberOfOperands, int m_numberOfRows, int m_numberOfColumns, bool cloneOperands); ~ExpressionMatrix(); ExpressionMatrix(const Matrix& other) = delete; ExpressionMatrix(Matrix&& other) = delete; diff --git a/poincare/include/poincare/matrix_data.h b/poincare/include/poincare/matrix_data.h index 79b1344c4..5dc3d1eb8 100644 --- a/poincare/include/poincare/matrix_data.h +++ b/poincare/include/poincare/matrix_data.h @@ -12,7 +12,7 @@ class Complex; class MatrixData { public: MatrixData(ListData * listData, bool clone); - MatrixData(Expression ** newOperands, int numberOfOperands, int m_numberOfColumns, int m_numberOfRows, bool cloneOperands); + MatrixData(Expression ** newOperands, int numberOfOperands, int m_numberOfRows, int m_numberOfColumns, bool cloneOperands); ~MatrixData(); MatrixData(const MatrixData& other) = delete; MatrixData(MatrixData&& other) = delete; diff --git a/poincare/src/complex_matrix.cpp b/poincare/src/complex_matrix.cpp index 658b0225b..7fc368963 100644 --- a/poincare/src/complex_matrix.cpp +++ b/poincare/src/complex_matrix.cpp @@ -18,8 +18,8 @@ ComplexMatrix::ComplexMatrix(const Complex * complexes, int numberOfRows, m_numberOfColumns(numberOfColumns) { assert(complexes != nullptr); - m_values = new Complex[numberOfColumns*numberOfRows]; - for (int i = 0; i < numberOfColumns*numberOfRows; i++) { + m_values = new Complex[numberOfRows*numberOfColumns]; + for (int i = 0; i < numberOfRows*numberOfColumns; i++) { m_values[i] = complexes[i]; } } @@ -31,7 +31,7 @@ ComplexMatrix::~ComplexMatrix() { template T ComplexMatrix::toScalar() const { - if (m_numberOfColumns != 1 || m_numberOfRows != 1) { + if (m_numberOfRows != 1 || m_numberOfColumns != 1) { return NAN; } if (m_values[0].b() != 0) { @@ -87,8 +87,8 @@ Evaluation * ComplexMatrix::createIdentity(int dim) { template template Evaluation * ComplexMatrix::templatedEvaluate(Context& context, Expression::AngleUnit angleUnit) const { - Complex * values = new Complex[m_numberOfColumns*m_numberOfRows]; - for (int i = 0; i < m_numberOfColumns*m_numberOfRows; i++) { + Complex * values = new Complex[m_numberOfRows*m_numberOfColumns]; + for (int i = 0; i < m_numberOfRows*m_numberOfColumns; i++) { values[i] = Complex::Cartesian(m_values[i].a(), m_values[i].b()); } Evaluation * result = new ComplexMatrix(values, m_numberOfRows, m_numberOfColumns); diff --git a/poincare/src/evaluation.cpp b/poincare/src/evaluation.cpp index 1519665b0..24fad4d16 100644 --- a/poincare/src/evaluation.cpp +++ b/poincare/src/evaluation.cpp @@ -31,7 +31,7 @@ const Expression * Evaluation::operand(int i) const { template Evaluation * Evaluation::createTrace() const { - if (numberOfColumns() != numberOfRows()) { + if (numberOfRows() != numberOfColumns()) { return new Complex(Complex::Float(NAN)); } int dim = numberOfRows(); @@ -45,7 +45,7 @@ Evaluation * Evaluation::createTrace() const { template // TODO: implement determinant for complex matrix? Evaluation * Evaluation::createDeterminant() const { - if (numberOfColumns() != numberOfRows()) { + if (numberOfRows() != numberOfColumns()) { return new Complex(Complex::Float(NAN)); } int dim = numberOfRows(); @@ -107,7 +107,7 @@ Evaluation * Evaluation::createDeterminant() const { template Evaluation * Evaluation::createInverse() const { - if (numberOfColumns() != numberOfRows()) { + if (numberOfRows() != numberOfColumns()) { return new Complex(Complex::Float(NAN)); } int dim = numberOfRows(); @@ -175,6 +175,7 @@ Evaluation * Evaluation::createInverse() const { delete[] inv[i]; } delete[] inv; + // Intentionally swapping dimensions for inverse, although it doesn't make a difference because it is square Evaluation * matrix = new ComplexMatrix(operands, numberOfColumns(), numberOfRows()); delete[] operands; return matrix; @@ -188,6 +189,7 @@ Evaluation * Evaluation::createTranspose() const { operands[j*numberOfRows()+i] = *(complexOperand(i*numberOfColumns()+j)); } } + // Intentionally swapping dimensions for transpose Evaluation * matrix = new ComplexMatrix(operands, numberOfColumns(), numberOfRows()); delete[] operands; return matrix; diff --git a/poincare/src/expression_matrix.cpp b/poincare/src/expression_matrix.cpp index 95206fbf2..6945d144c 100644 --- a/poincare/src/expression_matrix.cpp +++ b/poincare/src/expression_matrix.cpp @@ -16,9 +16,9 @@ ExpressionMatrix::ExpressionMatrix(MatrixData * matrixData) : { } -ExpressionMatrix::ExpressionMatrix(Expression ** newOperands, int numberOfOperands, int numberOfColumns, int numberOfRows, bool cloneOperands) +ExpressionMatrix::ExpressionMatrix(Expression ** newOperands, int numberOfOperands, int numberOfRows, int numberOfColumns, bool cloneOperands) { - m_matrixData = new MatrixData(newOperands, numberOfOperands, numberOfColumns, numberOfRows, cloneOperands); + m_matrixData = new MatrixData(newOperands, numberOfOperands, numberOfRows, numberOfColumns, cloneOperands); } ExpressionMatrix::~ExpressionMatrix() { @@ -60,7 +60,7 @@ Expression::Type ExpressionMatrix::type() const { Expression * ExpressionMatrix::cloneWithDifferentOperands(Expression** newOperands, int numberOfOperands, bool cloneOperands) const { assert(newOperands != nullptr); - return new ExpressionMatrix(newOperands, numberOfOperands, numberOfColumns(), numberOfRows(), cloneOperands); + return new ExpressionMatrix(newOperands, numberOfOperands, numberOfRows(), numberOfColumns(), cloneOperands); } template diff --git a/poincare/src/matrix_data.cpp b/poincare/src/matrix_data.cpp index 2c9c2ecda..0489429be 100644 --- a/poincare/src/matrix_data.cpp +++ b/poincare/src/matrix_data.cpp @@ -23,13 +23,13 @@ MatrixData::MatrixData(ListData * listData, bool clone) : } } -MatrixData::MatrixData(Expression ** newOperands, int numberOfOperands, int numberOfColumns, int numberOfRows, bool cloneOperands) : +MatrixData::MatrixData(Expression ** newOperands, int numberOfOperands, int numberOfRows, int numberOfColumns, bool cloneOperands) : m_numberOfRows(numberOfRows), m_numberOfColumns(numberOfColumns) { assert(newOperands != nullptr); m_operands = new Expression *[m_numberOfRows*m_numberOfColumns]; - for (int i = 0; i < m_numberOfColumns*m_numberOfRows; i++) { + for (int i = 0; i < m_numberOfRows*m_numberOfColumns; i++) { if (cloneOperands) { m_operands[i] = i < numberOfOperands ? newOperands[i]->clone() : defaultExpression(); } else { @@ -44,7 +44,7 @@ Complex * MatrixData::defaultExpression() { } MatrixData::~MatrixData() { - for (int i=0; i Power::compute(const Complex c, const Complex d) { } template Evaluation * Power::templatedComputeOnComplexMatrixAndComplex(Evaluation * m, const Complex * d) const { - if (m->numberOfColumns() != m->numberOfRows()) { + if (m->numberOfRows() != m->numberOfColumns()) { return new Complex(Complex::Float(NAN)); } T power = d->toScalar();