次のような関数シグネチャがあります。
static public double[][] G2Sweep(int row1, int row2, double[][] mtx)
{
mtx = (float) mtx;
}
しかし、double[][] マトリックスを float 値に変換する必要があります。コードは明示的に変換できないため、これはどのように行われますか?
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();
}
いいえ、特に配列の場合、 double を float に変換することはできません。正しいタイプのコピーを作成する必要があります。
これを行う別の方法は、Array.ConvertAll メソッドを使用することです。
Array.ConvertAll<double, float>(doubles, d => (float)d);
同じループと明示的な変換を行いますが、見栄えが良くなります。
確かに、その場で変換することはできず、値をループする必要があります。
しかし、最近ではメモリが安いと言っても過言ではありません* 。
double[][]変数を作成する時点で; 同時にfloat[][]も作成して、変換が1か所で行われるようにしないのはなぜですか。
そうすれば、ライフサイクルの残りの部分で、書き込みタスクに書き込み配列を使用できます。
そうは言っても、なぜ別個のフロートとダブル配列が必要なのかを明確にできますか?
*公平ですが、必ずしも受け入れられるとは限りません。独自のボックスまたは仮想イメージでホストされているWebアプリの場合。それなら大丈夫です。これがネットブックまたはSilverlightのどこかで動作する必要があるスタンドアロンのアプリである場合、それは公平でも問題でもありません。
はい、すべての値をフロートしますが、すべてをループするために for ループを実行する必要はありません。
申し訳ありませんが、できません。float
配列を(またはint
、またはString
、または など)のような型にキャストしてMonkeyPoo
も意味がありません。配列内のすべての値を調べる必要がある場合は、ループが必要です。その事実を回避することはできません。
ラムダなどはすべてループに要約されます。弾丸をかむだけで、A) ループで変換する (または のようなものを使用する.Cast<float>
) か、最初から正しい型を使用する必要があります。
Linqを使用すると、手動でループを作成する必要がなくなります。
float[][] floats = mtx.Select(r=>r.Select(Convert.ToSingle).ToArray()).ToArray();
編集:修正されました。