我有一个函数签名,如:
static public double[][] G2Sweep(int row1, int row2, double[][] mtx)
{
mtx = (float) mtx;
}
但我需要将 double[][] 矩阵转换为浮点值。这是如何完成的,因为代码无法显式转换它?
public static float[][] Convert(double[][] mtx)
{
var floatMtx = new float[mtx.Length][];
for (int i = 0; i < mtx.Length; i++)
{
floatMtx[i] = new float[mtx[i].Length];
for (int j = 0; j < mtx[i].Length; j++)
floatMtx[i][j] = (float)mtx[i][j];
}
return floatMtx;
}
或者:
public static float[][] Convert(double[][] mtx)
{
return mtx.Select(i => i.Select(j => (float)j).ToArray()).ToArray();
}
不,您不能将双精度转换为浮点数,尤其是对于数组。您需要创建具有正确类型的副本。
Another way you can do this by is using the Array.ConvertAll method:
Array.ConvertAll<double, float>(doubles, d => (float)d);
Does the same looping and explicit converting, but looks better.
是的,所有值都浮动,但我宁愿不必做一个 for 循环来遍历这一切
好吧,对不起,但你不能。将数组转换为float
(or int
, or String
, or MonkeyPoo
, or anything) 之类的类型是没有意义的。如果您需要查看数组中的每个值,那么您需要一个循环。无法回避这个事实。
Lamdas 之类的也都归结为一个循环。您只需要咬紧牙关,然后 A) 在循环中转换(或使用类似的东西.Cast<float>
),或者使用正确的类型开始。
确实,您无法就地转换,并且必须循环遍历这些值。
但是,现在可以说内存很便宜。
在创建你的 double[][] 变量时;为什么不简单地同时创建一个 float[][] ,这样转换就完成了。
这样,在您生命周期的剩余时间里,您可以只使用 write 数组来执行 write 任务。
也就是说,你能澄清为什么你需要一个不同的 float 和 double 数组吗?
*Fair but not necessarily acceptable; if it's a webapp hosted on its own box or virtual image; then it's fine. If this is a standalone app that might have to work on a netbook or in Silverlight somewhere, it is not fair or fine.
如果您使用 Linq,则可以避免手动编写循环。
float[][] floats = mtx.Select(r=>r.Select(Convert.ToSingle).ToArray()).ToArray();
编辑:固定。