我有一个ConcurrentDictionary数组,其中每个数组都有相同的固定大小。它看起来像这样:ConcurrentDictionary<int, double[]> ItemFeatures
我希望通过将所有值除以该列中值的最大值来规范化列表中的值。例如,如果我的列表大小为5,我希望第一个位置的每个元素除以该位置中所有值的最大值,依此类推第2个位置。
我能想到的这种天真的方式是首先迭代列表中的每个列表和每个元素,并存储每个位置的最大值。然后再次迭代它们并将它们除以先前找到的最大值。
在Linq中有更优雅的方式吗?这些词典会很大,所以效率越高/耗时越少越好。
答案 0 :(得分:0)
不,这实际上是最有效的方式。最后,无论如何,这是你需要做的,你不能跳过任何东西。您可能会以某种方式在LINQ中编写它,但性能会更糟,因为它会有很多函数调用和内存分配。 LINQ不会创造奇迹,它只是一种(有时)较短的写作方式。
如果您的算法具有良好的“缓存局部性” - 换句话说,如果您以顺序方式访问计算机内存,那么可以加快速度的是什么呢?在像.NET这样的环境中很难保证,但是你所描述的循环可能最接近它。
答案 1 :(得分:0)
LINQ用于查询数据,而不是修改数据。您可以使用一点LINQ来计算最大值,但这是关于它的:
var cols = ItemFeatures.First().Value.Length;
var maxv = new double[cols];
for (var j1 = 0; j1 < cols; ++j1)
maxv[j1] = ItemFeatures.Values.Select(vs => vs[j1]).Max();
foreach (var kvp in ItemFeatures)
for (var j1 = 0; j1 < cols; ++j1)
kvp.Value[j1] /= maxv[j1];