3 Stimmen

Können Sie LINQ oder Lambdas verwenden, um Matrixoperationen durchzuführen?

Ich weiß, wie man das mit for-Schleifen macht. Ist es möglich, etwas wie dies mit LINQ oder Lambdas zu tun?

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

0 Stimmen

Aber warum sollten Sie überhaupt LINQ verwenden? Was ist falsch an einer vertrauten "for-Schleife", die jeder verstehen kann?

0 Stimmen

...oder verwenden Sie einfach eine Matrix-Klassenbibliothek...

0 Stimmen

Lustigerweise habe ich beantwortete heute eine weitere Frage der die Zahlen in zwei Reihenfolgen summiert.

6voto

Jon Skeet Punkte 1325502

EDIT: Der Code unten wird funktionieren, aber es ist nicht so lesbar wie mit einer expliziten Methode. LINQ ist großartig, wo es definitiv fügt hinzu. zur Lesbarkeit... aber dies ist keiner dieser Fälle.

Dies ist eine gekürzte Fassung der CMS-Antwort - das Extra let ist nicht erforderlich, und wenn man nur eine Projektion durchführt, ist es einfacher, einfach die Punktnotation zu verwenden:

int[] result = Enumerable.Range(0, a.Length)
                         .Select(i => a[i] * b[i])
                         .ToArray();

Eine Alternative ist die Verwendung der Form von Select, die einen Index annimmt:

int[] result = a.Select((value, index) => value * b[index])
                .ToArray();

0 Stimmen

@Jon: Sicherlich ermutigen Sie die Leute nicht, es auf diese Weise zu tun!

5voto

Cameron MacFarland Punkte 67889

Verwendung der Zip-Funktion (neu in .NET 4.0) Details aquí :

int[] a = { 10, 20, 30 };
int[] b = { 2, 4, 10 };

int[] c = a.Zip(b, (a1, b1) => a1 * b1).ToArray();

Bis zum Erscheinen von .NET 4 können Sie die Zip-Implementierung unter dem obigen Link verwenden.

2voto

Christian C. Salvadó Punkte 763569

Sie können so vorgehen:

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();
}

Aber ich empfehle Ihnen, wenn Sie mit Matrizen und fortgeschritteneren mathematischen Themen arbeiten wollen, eine gute Mathe-Bibliothek zu kaufen, wie z.B. NMath oder suchen Sie nach einem Matrix-Klasse Umsetzung, es gibt viele da draußen...

2voto

Robert Wagner Punkte 16985

Es ist nichts eingebaut, aber Sie können jederzeit Ihre eigenen Funktionen schreiben. Die erste unten ist eine einfache Erweiterungsmethode, die tut, was Sie wollen. Die zweite ermöglicht es Ihnen, die anzuwendende Funktion anzugeben:

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;
    }
}

0voto

Lance Fisher Punkte 25464

Sehen Sie sich das an MSDN-Artikel über das kommende PLINQ (Parallel LINQ). In dem Artikel finden Sie ein Beispiel für die Verwendung von PLINQ zur Parallelisierung der Matrixmultiplikation:

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];
      }
    }
  });
}

Es verwendet LINQ und ein Lambda! Und als Bonus ist sie auf mehrere Prozessoren verteilt.

0 Stimmen

Es verwendet die Task Parallel Library (TPL) und Delegates (nicht Lambda).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X