Frage

Ich muss eine Multiplikationsformel implementieren, bei der eine Zeilenmatrix der Größe 'n' mit einer N*n Matrix multipliziert werden soll.

Ich habe die Densematrix -Klasse verwendet, um die N*n Matrix aus einem 2D -Array zu erstellen ... aber mein Problem ist, wie man einen Zeilenvektor erstellt ...

Ich kann die comprowmatrix -Klasse verwenden, um eine Zeilenmatrix zu erstellen ... aber dafür muss die Eingabe von 'Matrix' sein. Aber Matrix ist eine Schnittstelle. Kann sie nicht instanziieren. Der erste Konstruktor von Comprowmatrix -Klasse Staaten, es erfordert eine "Array von Indizes ungleich Null als Eingabe". Aber ich kann nicht verstehen, was diese ungleich Null-Array von Indizes ist?

Außerdem kann ich einen Vektor mit erstellen Densevector oder eine andere geeignete Klasse ... aber es scheint keine Methode zu geben, um einen Vektor direkt mit einer Matrix zu multiplizieren.

Bitte Hilfe

War es hilfreich?

Lösung

Das CompRowMatrix Die Klasse soll nicht wirklich als Zeilenvektor verwendet werden, sondern wird verwendet, um spärliche Matrices so darzustellen, dass sie leicht über die Zeile der Matrixelemente iteriert werden kann.

Während es möglich ist zu verwenden CompRowMatrix Als Vektor, indem alle anderen Zeilen als die 1. bis Null festgelegt werden, ist dies für Sie als Programmierer komplizierter und weniger effizient für den Code, der annehmen muss, dass andere Zeilen möglicherweise ungleich Null werden könnten.

Verwenden Sie stattdessen a DenseVector Objekt, Ihren Zeilenvektor zu halten und die zu verwenden mult Methode aus der Matrix Schnittstelle. Es akzeptiert zwei Vector Objekte als Argumente und erzeugt ein Vektor-Matrix-Produkt. Die Methode wird auf das Matrixobjekt aufgerufen, das mit den folgenden Argumenten multipliziert wird:

  • 1. arg, x, ist der Vektor, den Sie mit Ihrer Matrix vermehren möchten
  • 2. arg, y, hält das Ergebnis der Multiplikation

Um das Vektor-Matrix-Produkt zu produzieren y = x*A (wo beides x und y sind 1xnReihenvektoren und A ist ein nxn Matrix), Sie würden so etwas tun:

// create matrix A
double[][] matValues = new double[n][n];
... // initialize values of the matrix
Matrix A = new DenseMatrix(matValues);

// create vector x
double[] vecValues = new double[n];
... // initialize values of the vector
Vector x = new DenseVector(vecValues);

// create vector y to store result of multiplication
Vector y = new DenseVector(n);

// perform multiplication
A.mult(x, y);

Jetzt können Sie verwenden y im restlichen Code nach Bedarf. Es ist wichtig, dass Sie zuordnen y Vor der Multiplikation, aber es ist irrelevant, welche Daten sie haben. Das mult Die Methode überschreibt, was auch immer ist y Beim Ausgang.

Beachten Sie auch, dass ich mich für die Initialisierung entschieden habe x und A waren nicht die einzigen Möglichkeiten. Zum Beispiel kopiert der obige Code die Arrays automatisch tief vecValues und matValues Beim Konstruktion der entsprechenden Vector und Matrix Objekte. Wenn Sie nicht beabsichtigen, die Arrays für einen anderen Zweck zu verwenden, sollten Sie diese tiefe Kopie wahrscheinlich nicht ausführen. Sie tun dies, indem Sie einen zusätzlichen booleschen Paramer übergeben, der im Konstruktor auf False festgelegt ist, z. B.

// create matrix A without deep copying matValues
Matrix A = new DenseMatrix(matValues, false);

Sie sollten sich auf den Javadoc beziehen, den Sie und ich mit früheren Konstruktoroptionen verlinkt haben. Beachten Sie jedoch, dass Javadoc für eine andere Version ist, die die aktuelle Veröffentlichung von MTJ (Version 1.01 zum Zeitpunkt dieses Beitrags). Ich weiß nicht, für welche Version es ist, und ich habe Javadoc für die aktuelle Version nicht gefunden, aber ich habe ein paar Unterschiede zwischen ihm und dem entdeckt Aktueller Quellcode.

Andere Tipps

Wenn ich Ihre Frage verstehe, besteht eine Lösung darin, eine Matrix mit einer Zeile und N -Spalten zu erstellen, um die NXN -Matrix zu präsentieren. Es gibt Routinen zum Multiplizieren von Vektoren, aber ich glaube, sie alle haben den Vektor nach dem Multiplizieren der Matrix. Wenn Sie diese Routinen stattdessen verwenden möchten, müssten Sie die entsprechenden Übertragungen durchführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top