Ваше описание звучит так, будто вы делаете разложение LU на месте. Это, безусловно, более эффективно с точки зрения памяти. Это означает перезапись значений матрицы при выполнении декомпозиции. Если это правда, то «быть измененным и пересчитать ли факторизацию» является спорным вопросом. Вы теряете исходную матрицу, когда перезаписываете ее разложением LU.
Если вы НЕ перезаписываете оригинал, это также звучит так, как будто вы хотите пересчитать декомпозицию всякий раз, когда вы присваиваете элементу матрицы новое значение. Я бы порекомендовал вам не делать этого. Это кажется мне неэффективным. Если бы клиент хотел изменить много значений, он, вероятно, не захотел бы оплатить стоимость другой декомпозиции LU, пока все они не будут завершены.
Вы можете попробовать заводской интерфейс для матричных преобразований / разложений. Это простой метод, который принимает матрицу и возвращает (разложенную) матрицу. Вы сохраняете свою оригинальную матрицу таким образом; возвращаемое значение является новым экземпляром. Вы можете изменить оригинал и затем передать его на завод, чтобы пересчитать разложение LU. Это стоит вашей памяти, что может быть проблемой для очень больших матриц.
На Java я бы написал так:
public interface MatrixDecomposition
{
Matrix decompose(Matrix original);
}
В C ++ это была бы чисто виртуальная функция. (Слишком долго - я не могу вспомнить синтаксис.)
Существуют и другие типы разложения (например, QR, SVD и т. Д.), Поэтому этот дизайн будет хорошо приспособлен к тем, когда они вам нужны. Просто напишите другую реализацию для интерфейса, и Боб станет вашим дядей.
Многие физические проблемы характеризуются «разреженными» матрицами, которые имеют полосу пропускания ненулевых значений, сгруппированных вокруг диагонали и нулей снаружи. Если вы используете специальные методы, которые не сохраняют нулевые значения вне полосы пропускания, вы можете решить большие проблемы в памяти.