Question

I besoin de mettre en oeuvre une formule de multiplication où une matrice de ligne de taille « n » est à multiplier par une matrice n * n ..

Je l'ai utilisé pour créer la classe DenseMatrix la matrice n * n à partir d'un tableau 2D ... mais mon problème est de savoir comment créer une ligne vecteur ...

Je peux utiliser la classe CompRowMatrix pour créer une matrice de ligne ... mais pour cela, entrée doit être de « Matrix » .. mais Matrix est une instanciation de interface..can't it..the premier constructeur de classe CompRowMatrix états, il a besoin d'un ' tableau non nulle des indices' comme input..but je suis incapable de comprendre ce qui est ce tableau non nul d'indices ??

aussi, je peux créer un vecteur

Était-ce utile?

La solution

La classe CompRowMatrix est pas vraiment destiné à être utilisé comme vecteur de ligne, il est plutôt utilisé pour représenter matricies clairsemées de telle sorte qu'il est facile de parcourir les éléments de la matrice ligne par ligne.

Bien qu'il soit possible d'utiliser CompRowMatrix comme vecteur en réglant toutes les lignes autres que le 1er à zéro, ce qui est plus compliqué pour vous en tant que programmeur et moins efficace pour le code qui doit supposer que d'autres lignes pourraient devenir non -zéro.

Au lieu de cela, utilisez un objet DenseVector pour tenir votre vecteur de ligne et utiliser le mult méthode de l'interface Matrix. Il accepte deux objets Vector comme arguments et produit un produit vecteur-matrice. La méthode est appelée sur l'objet de la matrice étant multipliée avec les paramètres suivants:

  • 1er arg, x, est le vecteur que vous voulez multiplier avec votre matrice
  • 2 arg, y, détient le résultat de la multiplication

Donc, pour produire le produit vecteur-matrice y = x*A (où les deux x et y sont des vecteurs 1xnrow et A est une matrice de nxn), vous feriez quelque chose comme ceci:

// 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);

Vous pouvez maintenant utiliser y dans le reste de votre code au besoin. Il est important que vous allouez y avant la multiplication, mais il est hors de propos les données qu'il détient. La méthode de mult écrasera tout ce qui est en y à la sortie.

Notez également que les façons j'ai choisi de initialize x et A ne sont pas les seuls moyens disponibles. Par exemple, le code ci-dessus automatiquement en profondeur les copies des tableaux vecValues et matValues lors de la construction des objets et Vector Matrix correspondants. Si vous ne souhaitez pas utiliser les tableaux pour d'autres fins, alors vous ne devriez probablement pas effectuer cette copie en profondeur. Pour ce faire, le passage d'un ensemble de paramter booléen supplémentaire false dans le constructeur, par exemple.

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

Vous devriez se référer à la javadoc vous et moi lié plus haut pour plus d'options constructeur. Sachez, cependant, que ledit javadoc est une version différente que la version actuelle de MTJ (version 1.01 au moment de ce post). Je ne sais pas quelle version il est pour n'ai pas été en mesure de trouver javadoc pour la version actuelle, mais je l'ai repérer quelques différences entre elle et le code source de courant .

Autres conseils

Si je comprends bien votre question, une solution serait de créer une matrice avec une ligne et n colonnes à Prémultiplier n x n matrice. Il y a des routines de multiplication des vecteurs, mais je crois qu'ils ont tout le vecteur de post-multiplication de la matrice. Si vous souhaitez utiliser ces routines à la place, vous auriez à faire les transposés appropriées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top