forループを使用してこれを行う方法を知っています。LINQ またはラムダを使用してこのようなことを行うことは可能ですか?
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a * b; //resulting array should be { 20, 80, 300 }
編集: 以下のコードは機能しますが、明示的な方法を使用するほど読みやすくはありません。LINQ は、読みやすさが確実に向上する点で優れていますが、これはそのようなケースではありません。
これは CMS の回答の簡潔なバージョンです。余分なlet
ものは必要ありません。投影を行うだけの場合は、ドット表記を使用する方が簡単です。
int[] result = Enumerable.Range(0, a.Length)
.Select(i => a[i] * b[i])
.ToArray();
別の方法は、インデックスを取る Select の形式を使用することです。
int[] result = a.Select((value, index) => value * b[index])
.ToArray();
Zip 関数の使用 (.NET 4.0 の新機能) 詳細はこちら:
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a.Zip(b, (a1, b1) => a1 * b1).ToArray();
.NET 4 がリリースされるまでは、上記のリンクから zip 実装を使用できます。
次のようなことができます。
int[] a = {10, 20, 30};
int[] b = {2, 4, 10};
if (a.Length == b.Length)
{
int[] result = (from i in Enumerable.Range(0, a.Length)
let operation = a[i]*b[i]
select operation).ToArray();
}
しかし、行列やより高度な数学のトピックを扱って、NMathなどの優れた数学ライブラリを取得したり、 Matrix クラスの実装を検索したりする場合は、そこにたくさんあることをお勧めします...
何も組み込まれていませんが、いつでも独自の関数を作成できます。以下の最初のものは、あなたが望むことをする単純な拡張メソッドです。2 つ目では、適用する関数を指定できます。
class Program
{
public static void Main(string[] args)
{
int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a.MatrixMultiply(b);
int[] c2 = a.Zip(b, (p1, p2) => p1 * p2);
}
}
public static class Extension
{
public static int[] MatrixMultiply(this int[] a, int[] b)
{
// TODO: Add guard conditions
int[] c = new int[a.Length];
for (int x = 0; x < a.Length; x++)
{
c[x] = a[x] * b[x];
}
return c;
}
public static R[] Zip<A, B, R>(this A[] a, B[] b, Func<A, B, R> func)
{
// TODO: Add guard conditions
R[] result = new R[a.Length];
for (int x = 0; x < a.Length; x++)
{
result[x] = func(a[x], b[x]);
}
return result;
}
}
今後の PLINQ (Parallel LINQ)に関するこの MSDN の記事を確認してください。この記事から、PLINQ を使用して行列乗算を並列化する例を次に示します。
void ParMatrixMult(int size, double[,] m1, double[,] m2, double[,] result)
{
Parallel.For( 0, size, delegate(int i) {
for (int j = 0; j < size; j++) {
result[i, j] = 0;
for (int k = 0; k < size; k++) {
result[i, j] += m1[i, k] * m2[k, j];
}
}
});
}
LINQ と Lambda を使用しています。おまけとして、それはプロセッサ全体に広がっています。