我需要将多维 double 组转换为锯齿状 float 组。大小将从 [2][5] 到大约 [6][1024] 不等。
我很好奇如何将 double 循环并转换为 float ,这还不错,对于 [2][5] 数组大约需要 225µs - 这是代码:
const int count = 5;
const int numCh = 2;
double[,] dbl = new double[numCh, count];
float[][] flt = new float[numCh][];
for (int i = 0; i < numCh; i++)
{
flt[i] = new float[count];
for (int j = 0; j < count; j++)
{
flt[i][j] = (float)dbl[i, j];
}
}
但是,如果有更有效的技术,我想使用它们。我应该提到我只对两个嵌套循环计时,而不是它之前的分配。
经过更多的实验,我认为 99% 的时间都花在了循环上,即使没有分配!
最佳答案
这会运行得更快,对于小数据不值得做 Parallel.For(0, count, (j) =>
它实际上对于非常小的数据运行相当慢,这就是为什么我已将该部分注释掉。
double* dp0;
float* fp0;
fixed (double* dp1 = dbl)
{
dp0 = dp1;
float[] newFlt = new float[count];
fixed (float* fp1 = newFlt)
{
fp0 = fp1;
for (int i = 0; i < numCh; i++)
{
//Parallel.For(0, count, (j) =>
for (int j = 0; j < count; j++)
{
fp0[j] = (float)dp0[i * count + j];
}
//});
flt[i] = newFlt.Clone() as float[];
}
}
}
这运行得更快,因为双重访问双重数组 [,]
由于数组边界检查,在 .NET 中确实很费力。 newFlt.Clone()
只是意味着我们不会一直修复和取消修复新指针(因为这样做会产生轻微的开销)
您需要使用 unsafe
代码标签运行它并使用 /UNSAFE
编译
但实际上,您应该使用接近 5000 x 5000 而不是 5 x 2 的数据运行,如果某件事花费的时间少于 1000 毫秒,您需要添加更多循环或增加数据,因为在那个级别 cpu 事件会出现轻微峰值会给您的分析添加很多噪音。
关于c# - 有没有更有效的方法将 double 转换为 float?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7671700/