3

forループを使用してこれを行う方法を知っています。LINQ またはラムダを使用してこのようなことを行うことは可能ですか?

int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };
int[] c = a * b; //resulting array should be { 20, 80, 300 }
4

7 に答える 7

6

編集: 以下のコードは機能しますが、明示的な方法を使用するほど読みやすくはありません。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();
于 2008-11-23T07:45:16.060 に答える
5

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 実装を使用できます。

于 2008-11-23T07:53:40.770 に答える
2

次のようなことができます。

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 クラスの実装を検索したりする場合は、そこにたくさんあることをお勧めします...

于 2008-11-23T04:44:03.193 に答える
2

何も組み込まれていませんが、いつでも独自の関数を作成できます。以下の最初のものは、あなたが望むことをする単純な拡張メソッドです。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;
    }
}
于 2008-11-23T04:53:19.493 に答える
0

今後の 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 を使用しています。おまけとして、それはプロセッサ全体に広がっています。

于 2008-11-23T06:31:31.620 に答える