Quand je lisais "Linear Algebra and Its Applications" de G. Strang et que je cherchais une API en Java, j'ai trouvé une page intitulée "Let's Create a Matrix Class". Auparavant, j'ai créé une classe complexe rudimentaire. Je ne l'ai pas écrit dans l'article. Je voulais aussi créer ma propre bibliothèque mathématique un jour, j'ai donc créé une classe qui reflète la propriété des nombres complexes qui, lorsqu'ils sont au carré, deviennent -1. Pour le dire gentiment, j'ai l'impression d'avoir créé ma propre structure de données autour de cela et un algorithme qui devient -1 une fois au carré. Un objet de classe de nombre complexe créé lui-même reçoit deux entiers, et ce dernier entier est traité comme un coefficient de nombre complexe i. En d'autres termes, lorsque nous recevons le tableau [1,3], nous avons créé une classe qui l'interprète mathématiquement comme 1 + 3i. C'est la somme de 1 comme nombre réel et i × 3 comme nombre imaginaire. J'ai également créé une méthode (algorithme) pour ajouter et multiplier ces objets complexes (ayant un nombre réel et un nombre imaginaire).
Après cela, j'ai fait le premier problème de "Algèbre linéaire et son application", et ma tension en tant que programmeur était très élevée, j'ai donc essayé la classe matricielle cette fois. À ce stade, j'ai écrit une classe qui trouve le produit d'une matrice quadratique carrée et d'un vecteur colonne à deux composants.
Écrivons un article en résumé.
Site de référence Faisons une classe matricielle http://syrinx.q.t.u-tokyo.ac.jp/tori/java/basic/Matrix.html
Il y avait un exemple de JavaDoc dans le lien ci-dessous, j'ai donc écrit la classe qui y faisait référence. http://syrinx.q.t.u-tokyo.ac.jp/tori/java/basic/MatrixJavaDoc.html
Cette fois, c'est la première partie, donc j'écrirai sur l'addition et la soustraction. Dans cet article, je prends d'abord le style de programmation de l'écriture de JavaDoc, puis de l'implémentation du programme. Dans XP (Extreme Programming), j'écrirai à partir du code de test, mais cette fois j'ai trouvé le bon JavaDoc dans le lien ci-dessus, donc je l'ai implémenté basé sur JavaDoc.
Code ci-dessous Le dernier q de Matrixq est Qiita.
//ここはコードとして挿入されていませんが、コードをもし実行するならば、大事な宣言です。ただコメントなど日本語で加筆したこともあり、エラーが出るかもしれません。 // // private double [] [] double2DArray est également une déclaration obligatoire
public class Matrixq { private double[][] double2DArray; //Constructor
Matrixq (int rowSize, int columnSize) // Ceci est un constructeur qui crée un objet de la classe Matrixq //行と列のサイズを受け取ります { double2DArray=new double[rowSize][columnSize]; }
Matrixq (double [] [] mat2Darray) // Ceci est un autre constructeur qui crée un objet de classe Matrixq //double型の二次元配列を受け取ります、その二次元配列を名前mat2Darrayとして扱います //受け取ったその二次元配列を、インスタンス変数double2DArrayに代入します。 //mat2Darrayは、matrix2DimensinalArrayの略です { this.double2DArray=mat2Darray; }
//Instance Methods
double get (int i, int j) // Définit get () qui renvoie les éléments de mat2Darray [i] [j] de type double array { return double2DArray[i][j]; }
int getRowSize () // retourne la taille de la ligne getRowSize () est une méthode qui renvoie la taille de la ligne { int l=this.double2DArray.length; return l; }
int getColumnSize () // Renvoie la taille de la colonne getColumnSize () est une méthode qui renvoie la taille de la colonne { int l=this.double2DArray[0].length; return l; }
Jusqu'à présent, nous l'avons implémenté à partir du site de référence JavaDoc. Si vous connaissez le constructeur, le point est de savoir comment utiliser length () du tableau à deux dimensions. De plus, en langage Java, cette référence sort. J'utilise ceci pour accéder à une variable d'instance d'un objet d'une classe. Cependant, l'objet de cette classe n'a pas encore été créé. Par conséquent, vous ne pouvez pas utiliser l'opérateur point "nom.variable". ceci pointe vers un objet de cette classe et accède à sa variable d'instance en combinaison avec l'opérateur point.
la première Matrixq(int rowSize,int columnSize) { double2DArray=new double[rowSize][columnSize]; } Puis private double[][] double2DArray; Déclarez la taille d'un tableau bidimensionnel de type double déclaré comme variable d'instance privée dans. C'est le constructeur des objets de la classe Matrixq. Ce double privé [] [] double2DArray, une variable d'instance privée, sera créé automatiquement à chaque fois que vous créez un objet de la classe Matrixq.
Un tableau à deux dimensions est déclaré avec l'entier de type int rowSize reçu comme argument et la taille de columnSize. Le contenu du tableau bidimensionnel généré à ce moment (les valeurs de chaque élément) sont tous de 0,0. C'est une spécification Java. En d'autres termes, si vous utilisez un constructeur qui reçoit la taille de ligne et la taille de colonne, la valeur initiale de 0,0 est stockée dans le tableau bidimensionnel de type double de l'objet Matrixq créé.
Le constructeur suivant (définition multiple / polymorphisme) prend un tableau bidimensionnel de type double de contenu plus pratique comme argument et l'assigne au champ "double2DArray" de l'objet de classe Matrixq.
Ce champ doit être accessible avec getter (). C'est pourquoi nous avons une déclaration privée.
Le reste des méthodes d'instance peut être approximativement compris en regardant les commentaires. Ceci conclut l'explication du code ci-dessus.
Sous la méthode statique
//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");
}
}
L'algorithme ici est amusant pour le lecteur. (Prévu pour être ajouté) Le point est la mise en œuvre de la gestion des exceptions. La méthode isValidMatrix () vérifie que les deux matrices (objets Matrixq) à calculer sont d'une taille raisonnable qui peut être calculée comme une matrice. C'est un peu difficile, mais aussi une partie amusante des calculs de matrice de programmation. La classe dérivée "MatrixException" de RuntimeException est implémentée.
En fait, j'ai également créé une classe ColumnVector et écrit une classe pour le produit d'une matrice quadratique carrée x un vecteur colonne à deux composants.
Il était assez difficile de trouver le produit. J'ai trouvé une formule, je l'ai essayée dans une petite file d'attente et j'ai finalement essayé. Correction de la partie où la relation entre les lignes et les colonnes est inversée.
...
Recommended Posts