[poincare] Clean matrix power

Change-Id: I7ff27b45f240e0f6c89fb5bf79f21126475265e4
This commit is contained in:
Émilie Feral
2017-05-31 12:05:59 +02:00
parent 49f4e9b6e3
commit b58cfee5a1
3 changed files with 19 additions and 16 deletions

View File

@@ -33,6 +33,7 @@ public:
float determinant(Context& context, AngleUnit angleUnit) const;
Expression * createInverse(Context& context, AngleUnit angleUnit) const;
Expression * createTranspose(Context& context, AngleUnit angleUnit) const;
static Expression * createIdentity(int dim);
private:
ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override;
float privateApproximate(Context& context, AngleUnit angleUnit) const override;

View File

@@ -318,4 +318,20 @@ Expression * Matrix::createTranspose(Context& context, AngleUnit angleUnit) cons
return matrix;
}
Expression * Matrix::createIdentity(int dim) {
Expression ** operands = (Expression **)malloc(dim*dim*sizeof(Expression *));
for (int i = 0; i < dim; i++) {
for (int j = 0; j < dim; j++) {
if (i == j) {
operands[i*dim+j] = new Complex(Complex::Float(1.0f));
} else {
operands[i*dim+j] = new Complex(Complex::Float(0.0f));
}
}
}
Expression * matrix = new Matrix(new MatrixData(operands, dim*dim, dim, dim, false));
free(operands);
return matrix;
}
}

View File

@@ -78,28 +78,14 @@ Expression * Power::evaluateOnMatrixAndComplex(Matrix * m, Complex * c, Context&
}
if (power == 0.0f) {
/* Build the identity matrix with the same dimensions as m */
Expression ** operands = (Expression **)malloc(m->numberOfOperands()*sizeof(Expression *));
for (int i = 0; i < m->numberOfRows(); i++) {
for (int j = 0; j < m->numberOfColumns(); j++) {
if (i == j) {
operands[i*m->numberOfColumns()+j] = new Complex(Complex::Float(1.0f));
} else {
operands[i*m->numberOfColumns()+j] = new Complex(Complex::Float(0.0f));
}
}
}
Expression * matrix = new Matrix(new MatrixData(operands, m->numberOfOperands(), m->numberOfColumns(), m->numberOfRows(), false));
free(operands);
return matrix;
return Matrix::createIdentity(m->numberOfRows());
}
if (power < 0.0f) {
Expression * inverse = m->createInverse(context, angleUnit);
Expression * operands[2];
operands[0] = inverse;
operands[1] = new Complex(Complex::Float(-power));;
Expression * power = new Power(operands, true);
delete operands[0];
delete operands[1];
Expression * power = new Power(operands, false);
Expression * result = power->evaluate(context, angleUnit);
delete power;
return result;