struct Matrix(int row, int col){ /* ... */ }
// finds the inverse using Gauss–Jordan elimination
pure M inverse(M)(const ref M m){ /* ... */ }
Причина, по которой m
является ref
, связана с производительностью. Очевидно, я не хочу, чтобы большие матрицы копировались каждый раз, когда требуется обратное, и до сих пор это работало нормально.
Но это становится проблемой в ситуациях, когда инверсия требуется во время компиляции:
mixin template A(){
alias Matrix!(3, 3) Matrix3x3;
static Matrix3x3 computeSomeMatrix(){ }
immutable Matrix3x3 _m = computeSomeMatrix();
immutable Matrix3x3 _m_1 = inverse(computeSomeMatrix()); // error
}
Чтобы исправить ошибку, мне нужно изменить m
на non-ref, но это означает, что матрицы будут копироваться каждый раз при вызове inverse ()
. Что мне делать?