Als ich G. Strangs "Lineare Algebra und ihre Anwendungen" las und nach einer API in Java suchte, fand ich eine Seite mit dem Namen "Let's Create a Matrix Class". Zuvor habe ich eine rudimentäre komplexe Klasse erstellt. Ich habe es nicht in dem Artikel geschrieben. Ich wollte eines Tages auch meine eigene mathematische Bibliothek zusammenstellen, also habe ich eine Klasse erstellt, die die Eigenschaft komplexer Zahlen widerspiegelt, dass sie im Quadrat -1 wird. Um es gut auszudrücken, es fühlt sich so an, als hätte ich meine eigene Datenstruktur darum herum erstellt und einen Algorithmus, der im Quadrat -1 wird. Ein selbst erstelltes komplexes Zahlenklassenobjekt empfängt zwei ganze Zahlen, und die letztere ganze Zahl wird als Koeffizient der komplexen Zahl i behandelt. Mit anderen Worten, wenn wir das Array [1,3] erhalten, haben wir eine Klasse erstellt, die es mathematisch als 1 + 3i interpretiert. Es ist die Summe von 1 als reelle Zahl und i × 3 als imaginäre Zahl. Ich habe auch eine Methode (Algorithmus) zum Addieren und Multiplizieren dieser komplexen Objekte (mit einer reellen Zahl und einer imaginären Zahl) erstellt.
Danach habe ich das erste Problem der "linearen Algebra und ihre Anwendung" gelöst, und meine Spannung als Programmierer war so hoch, dass ich diesmal die Matrixklasse ausprobiert habe. Zu diesem Zeitpunkt habe ich eine Klasse geschrieben, die das Produkt einer quadratischen quadratischen Matrix und eines Spaltenvektors mit zwei Komponenten findet.
Schreiben wir einen Artikel als Zusammenfassung.
Referenzseite Lassen Sie uns eine Matrixklasse erstellen http://syrinx.q.t.u-tokyo.ac.jp/tori/java/basic/Matrix.html
Es gab ein Beispiel für JavaDoc im Link unten, also habe ich die Klasse geschrieben, die darauf verweist. http://syrinx.q.t.u-tokyo.ac.jp/tori/java/basic/MatrixJavaDoc.html
Diesmal ist es Teil 1, also werde ich über Addition und Subtraktion schreiben. In diesem Artikel verwenden wir zunächst den Programmierstil, JavaDoc zu schreiben und dann das Programm zu implementieren. In XP (Extreme Programming) werde ich aus dem Testcode schreiben, aber dieses Mal habe ich im obigen Link das richtige JavaDoc gefunden, also habe ich es basierend auf JavaDoc implementiert.
Code unten Das letzte q von Matrixq ist Qiita.
//ここはコードとして挿入されていませんが、コードをもし実行するならば、大事な宣言です。ただコメントなど日本語で加筆したこともあり、エラーが出るかもしれません。 // // private double [] [] double2DArray ist ebenfalls eine erforderliche Deklaration
public class Matrixq { private double[][] double2DArray; //Constructor
Matrixq (int rowSize, int columnSize) // Dies ist ein Konstruktor, der ein Objekt der Matrixq-Klasse erstellt //行と列のサイズを受け取ります { double2DArray=new double[rowSize][columnSize]; }
Matrixq (double [] [] mat2Darray) // Dies ist ein weiterer Konstruktor, der ein Objekt der Klasse Matrixq erstellt //double型の二次元配列を受け取ります、その二次元配列を名前mat2Darrayとして扱います //受け取ったその二次元配列を、インスタンス変数double2DArrayに代入します。 //mat2Darrayは、matrix2DimensinalArrayの略です { this.double2DArray=mat2Darray; }
//Instance Methods
double get (int i, int j) // Definiere get (), das die Elemente von mat2Darray [i] [j] des Double-Typ-Arrays zurückgibt { return double2DArray[i][j]; }
int getRowSize () // Zeilengröße zurückgeben getRowSize () ist eine Methode, die die Zeilengröße zurückgibt { int l=this.double2DArray.length; return l; }
int getColumnSize () // Gibt die Spaltengröße zurück. getColumnSize () ist eine Methode, die die Spaltengröße zurückgibt { int l=this.double2DArray[0].length; return l; }
Bisher haben wir es von der Referenzseite JavaDoc implementiert. Wenn Sie den Konstruktor kennen, müssen Sie die Länge () des zweidimensionalen Arrays verwenden. In der Java-Sprache wird diese Referenz ebenfalls veröffentlicht. Ich verwende dies, um auf eine Instanzvariable eines Objekts einer Klasse zuzugreifen. Das Objekt dieser Klasse wurde jedoch noch nicht erstellt. Daher können Sie den Punktoperator "name.variable" nicht verwenden. Dies zeigt auf ein Objekt dieser Klasse und greift in Kombination mit dem Punktoperator auf seine Instanzvariable zu.
Der Erste Matrixq(int rowSize,int columnSize) { double2DArray=new double[rowSize][columnSize]; } Dann private double[][] double2DArray; Deklarieren Sie die Größe eines zweidimensionalen Arrays vom doppelten Typ, das in als private Instanzvariable deklariert ist. Dies ist der Konstruktor für Objekte der Matrixq-Klasse. Dieses private double [] [] double2DArray, eine private Instanzvariable, wird jedes Mal automatisch erstellt, wenn Sie ein Objekt der Matrixq-Klasse erstellen.
Ein zweidimensionales Array wird mit der als Argument empfangenen Ganzzahl rowSize vom Typ int und der Größe von columnSize deklariert. Der Inhalt des zu diesem Zeitpunkt erzeugten zweidimensionalen Arrays (Werte jedes Elements) beträgt alle 0,0. Es ist eine Java-Spezifikation. Mit anderen Worten, wenn Sie einen Konstruktor verwenden, der die Zeilen- und Spaltengröße empfängt, wird der Anfangswert von 0.0 im zweidimensionalen Array vom doppelten Typ des erstellten Matrixq-Objekts gespeichert.
Der nächste Konstruktor (Mehrfachdefinition / Polymorphismus) verwendet ein praktischeres zweidimensionales Array mit doppeltem Inhalt als Argument und weist es dem Feld "double2DArray" des Matrixq-Klassenobjekts zu.
Auf dieses Feld sollte mit getter () zugegriffen werden. Deshalb haben wir eine private Erklärung.
Der Rest der Instanzmethoden kann anhand der Kommentare grob verstanden werden. Damit ist die Erläuterung des obigen Codes abgeschlossen.
Unten statische Methode
//Static Methods
public static Matrixq plus(Matrixq m1,Matrixq m2)
{
isValidMatrix(m1, m2);
Matrixq mAns=new Matrixq(m1.getRowSize(),m1.getColumnSize());
for(int i=0;i<m1.getRowSize();i++)
{
for(int j=0;j<m1.getColumnSize();j++)
{
mAns.double2DArray[i][j]=m1.double2DArray[i][j]+m2.double2DArray[i][j];
}
}
return mAns;
}
public static Matrixq minus(Matrixq m1,Matrixq m2)
{
isValidMatrix(m1, m2);
Matrixq mAns=new Matrixq(m1.getRowSize(),m1.getColumnSize());
for(int i=0;i<m1.getRowSize();i++)
{
for(int j=0;j<m1.getColumnSize();j++)
{
mAns.double2DArray[i][j]=m1.double2DArray[i][j]-m2.double2DArray[i][j];
}
}
return mAns;
}
private static void isValidMatrix(Matrixq m1, Matrixq m2) throws MatrixException
{
if(m1.getRowSize()!=m2.getRowSize() || m1.getColumnSize()!=m2.getColumnSize())
{
throw m1.new MatrixException("Matrix row, column size error. Check size");
}
}
Der Algorithmus hier macht dem Leser Spaß. (Geplant, hinzugefügt zu werden) Der Punkt ist die Implementierung der Ausnahmebehandlung. Die Methode isValidMatrix () überprüft, ob die beiden zu berechnenden Matrizen (Matrixq-Objekte) eine angemessene Größe haben, die als Matrix berechnet werden kann. Dies ist ein wenig schwierig, macht aber auch Spaß beim Programmieren von Matrixberechnungen. Die abgeleitete Klasse "MatrixException" von RuntimeException ist implementiert.
Eigentlich habe ich auch eine ColumnVector-Klasse erstellt und eine Klasse für das Produkt einer quadratischen quadratischen Matrix x eines Spaltenvektors mit zwei Komponenten geschrieben.
Es war ziemlich schwierig, das Produkt zu finden. Ich fand eine Formel, versuchte es in einer kleinen Warteschlange und versuchte es schließlich. Der Teil, in dem die Beziehung zwischen Zeilen und Spalten umgekehrt ist, wurde korrigiert.
...
Recommended Posts