我正在用这个构造函数构建一个相当大的矩阵:
var M = Matrix<double>.Build.Dense(N, N, (i, j) => SomeRoutine(i, j));
N
很大而且SomeRoutine
很慢,所以我试图在这里和那里优化一些东西。我注意到对于任何i, j
hold SomeRoutine(i, j) == SomeRoutine(j, i)
,即M
是对称的,因此可以只定义一个上(或下)三角形,从而减少对SomeRoutine
from N^2
to的调用次数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);
对我来说似乎不是很优雅。有什么方法可以在保留 lambda 样式声明的同时实现相同的优化想法?或者也许我应该编写某种可以屏蔽for
循环的包装器?