5

我有一个函数签名,如:

static public double[][] G2Sweep(int row1, int row2, double[][] mtx)
{
    mtx = (float) mtx;
}

但我需要将 double[][] 矩阵转换为浮点值。这是如何完成的,因为代码无法显式转换它?

4

6 回答 6

5
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();
}
于 2012-06-04T23:17:43.787 回答
4

不,您不能将双精度转换为浮点数,尤其是对于数组。您需要创建具有正确类型的副本。

于 2012-06-04T23:13:07.823 回答
2

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.

于 2014-01-21T06:16:30.710 回答
1

是的,所有值都浮动,但我宁愿不必做一个 for 循环来遍历这一切

好吧,对不起,但你不能。将数组转换为float(or int, or String, or MonkeyPoo, or anything) 之类的类型是没有意义的。如果您需要查看数组中的每个值,那么您需要一个循环。无法回避这个事实。

Lamdas 之类的也都归结为一个循环。您只需要咬紧牙关,然后 A) 在循环中转换(或使用类似的东西.Cast<float>),或者使用正确的类型开始。

于 2012-06-04T23:14:33.800 回答
1

确实,您无法就地转换,并且必须循环遍历这些值。

但是,现在可以说内存很便宜

在创建你的 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.

于 2012-06-04T23:20:12.913 回答
-1

如果您使用 Linq,则可以避免手动编写循环。

float[][] floats = mtx.Select(r=>r.Select(Convert.ToSingle).ToArray()).ToArray();

编辑:固定。

于 2012-06-04T23:19:13.153 回答