我有一个已排序的双精度值列表。 [100.3、100.7、101.1、...、4000.2]。
我有一个
Matrix<double>
,大小为 4096 * 4096,包含值
对于矩阵的每个值,我想获取排序列表中最接近值的索引,并用该索引替换当前的
matrix[i,j]
值。
到目前为止我有这个:
//Fill list from file
List<double> valueList = new List<double>();
string[] dataLine = File.ReadAllLines(listDataPath);
foreach (string line in dataLine)
{
valueList.Add(float.Parse(line.Replace('.', ',')));
}
//Create 4k matrix with values between 1000 and 3000 for example
int rows = 4096;
int columns = 4096;
var rand = new Random();
Matrix<double> mat = new(rows, columns);
Parallel.For(0, rows, i =>
{
for (int j = 0; j < columns; j++)
mat[i, j] = 1000f + (double)rand.NextDouble() * 2000f;
});
Stopwatch cs = new();
cs.Start();
Parallel.For(0, rows, i =>
{
for (int j = 0; j < columns; j++)
{
double newValue = valueList.BinarySearch(mat[i, j]);
mat[i, j] = newValue;
}
});
cs.Stop();
MessageBox.Show(cs.ElapsedMilliseconds.ToString());
执行此操作大约需要1秒。我已经使用过
Parallel.For
和 BinarySearch
。有没有更高效的方法?
您是否尝试过二分搜索以外的方法?插值搜索还是KD树(数据结构)?或者您怀疑当前方法中是否有任何特定部分会减慢速度?