Я создаю довольно большую матрицу с помощью этого конструктора а>:
var M = Matrix<double>.Build.Dense(N, N, (i, j) => SomeRoutine(i, j));
N
большой, а SomeRoutine
медленный, поэтому я пытаюсь оптимизировать некоторые моменты. Я заметил, что для любого i, j
выполняется SomeRoutine(i, j) == SomeRoutine(j, i)
, т.е. M
симметрично, поэтому можно определить только верхний (или нижний) треугольник, уменьшая количество обращений к SomeRoutine
с N^2
до N(N+1)/2
, что приятно.
Вот мой подход к этой оптимизации.
var arr = new double[N, N];
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
arr[i, j] = (i <= j) ? SomeRoutine(i, j) : arr[j, i];
}
}
var M = Matrix<double>.Build.DenseOfArray(arr);
Мне не кажется очень элегантным. Можно ли как-то приблизиться к той же идее оптимизации, сохранив объявление в стиле лямбда? Или, может быть, я должен написать какую-то обертку, которая будет маскировать for
циклов?