C# 将类型double[][]转换为float
我有一个函数签名,如:C# 将类型double[][]转换为float,c#,asp.net,.net,C#,Asp.net,.net,我有一个函数签名,如: static public double[][] G2Sweep(int row1, int row2, double[][] mtx) { mtx = (float) mtx; } 但我需要将双[][]矩阵转换为浮点值。由于代码不能显式地转换它,这是如何实现的?不,您不能将double转换为float-in-place,尤其是对于数组。您需要创建具有正确类型的副本 是的,所有的值都是浮动的,但我不想做for循环来遍历所有的值 对不起,你不能。将数组强制转换为f
static public double[][] G2Sweep(int row1, int row2, double[][] mtx)
{
mtx = (float) mtx;
}
但我需要将双[][]矩阵转换为浮点值。由于代码不能显式地转换它,这是如何实现的?不,您不能将double转换为float-in-place,尤其是对于数组。您需要创建具有正确类型的副本
是的,所有的值都是浮动的,但我不想做for循环来遍历所有的值 对不起,你不能。将数组强制转换为
float
(或int
,或String
,或MonkeyPoo
,或其他类型)没有意义。如果需要查看数组中的每个值,则需要一个循环。无法回避这个事实
Lamdas和诸如此类的东西也可以归结为一个循环。你只需要咬紧牙关,或者A)在循环中转换(或者使用类似
.Cast
),或者使用正确的类型作为开始。如果使用Linq,可以避免手动编写循环
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;
}
float[][] floats = mtx.Select(r=>r.Select(Convert.ToSingle).ToArray()).ToArray();
编辑:已修复。确实,您无法就地转换,必须循环使用这些值
然而,现在可以公平地说,内存很便宜
在创建双[]变量时;为什么不同时简单地创建一个float[][],这样转换就在原地完成了
这样,在剩余的生命周期中,您就可以使用写入阵列执行写入任务
也就是说,您能否澄清为什么需要一个不同的浮点和双数组
*公平但不一定可以接受;如果它是一个在自己的盒子或虚拟图像上托管的网络应用程序;那就好了。如果这是一个独立的应用程序,可能需要在上网本或Silverlight的某个地方运行,那么这是不公平的。另一种方法是使用Array.ConvertAll方法:
Array.ConvertAll<double, float>(doubles, d => (float)d);
Array.ConvertAll(double,d=>(float)d);
执行相同的循环和显式转换,但看起来更好。是否要转换整个矩阵,保留尺寸标注?“是的,所有值都要浮动,但我更希望不必执行for循环来完成所有转换。请不要在标题前加上“C#”之类的前缀。这就是标签的用途。克里斯,你能告诉我们这个交错排列的阵列的细节吗,它能容纳多少,它是如何创建的;它将持有什么,难道它首先不只是一个浮点数吗;尽管第二个例子看起来更简单;在内部,它将执行相同的循环。当然,它更容易阅读和维护!“然而,现在可以公平地说内存很便宜。”-我的上网本上写着“嗨”。如果这个参差不齐的数组会相对较大,那么创建两个数组是一个糟糕的解决方案,如果有任何东西会否定这样做的必要性的话。我希望更多的东西能促进作品的创作。创作可能是一个比转换更好的地方;在我们知道它是什么之前,它是没有意义的!向你的上网本道歉:)是的,我们要做的就是把所有的东西从double改为float(我的代码中有554个实例),以节省处理能力
Array.ConvertAll<double, float>(doubles, d => (float)d);