mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-29 11:39:58 +02:00
[poincare] Clean matrix power
Change-Id: I7ff27b45f240e0f6c89fb5bf79f21126475265e4
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user