Pregunta

Necesito implementar una fórmula de multiplicación donde una matriz de fila de tamaño 'n' sea multiplicada por una matriz n*n ..

He usado la clase Densematrix para crear la matriz n*n a partir de una matriz 2D ... pero mi problema es cómo crear un vector de fila ...

Puedo usar la clase ComprowMatrix para crear una matriz de fila ... pero para eso, la entrada debe ser de 'matriz' ... pero la matriz es una interfaz ... no puede instanciarla ... el primer constructor de Clase de ComprowMatrix establece que requiere una 'matriz de índices distintas de cero' como entrada ... pero no puedo entender qué es esta matriz de índices distintas de cero.

Además, puedo crear un vector con Vector densero o cualquier otra clase adecuada ... pero parece que no hay ningún método para multiplicar directamente un vector con una matriz.

por favor ayuda

¿Fue útil?

Solución

los CompRowMatrix La clase no está destinada a usarse como un vector de fila, sino que se usa para representar matricias escasas de tal manera que sea fácil de iterar sobre la fila de elementos matriciales por fila.

Si bien es posible usar CompRowMatrix Como vector estableciendo todas las filas que no sean las primeras a cero, esto es más complicado para usted como programador y menos eficiente para el código que debe asumir que otras filas podrían convertirse potencialmente en cero.

En su lugar, use un DenseVector OBJETO para mantener su vector de fila y use el múltiples método del Matrix interfaz. Acepta dos Vector Objetos como argumentos y produce un producto de matriz vectorial. El método se llama al objeto de matriz que se multiplica con los siguientes argumentos:

  • 1er arg, x, es el vector que quieres multiplicar con tu matriz
  • 2do arg, y, tiene el resultado de la multiplicación

Entonces, para producir el producto vectorial-matriz y = x*A (donde ambos x y y son 1Xnvectores de fila y A es un nXn matriz), harías algo como esto:

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

Ahora puedes usar y en el resto de su código según sea necesario. Es importante que asignes y Antes de la multiplicación, pero es irrelevante los datos que posee. los mult El método sobrescribirá lo que esté en y al salir.

También tenga en cuenta que las formas en que elegí inicializar x y A no eran las únicas formas disponibles. Por ejemplo, el código anterior copia automáticamente las matrices vecValues y matValues Al construir el correspondiente Vector y Matrix objetos. Si no tiene la intención de usar las matrices para ningún otro propósito, entonces probablemente no debería realizar esta copia profunda. Haces esto pasando un parámetro booleano adicional establecido en falso en el constructor, por ejemplo,

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

Debe consultar el Javadoc tanto usted como yo vinculamos anteriormente para obtener más opciones de constructor. Tenga en cuenta, sin embargo, que dijo que Javadoc es para una versión diferente que la versión actual de MTJ (versión 1.01 a partir del momento de esta publicación). No sé para qué versión es ni he podido encontrar javadoc para la versión actual, pero vi algunas diferencias entre él y el código fuente actual.

Otros consejos

Si entiendo su pregunta, una solución sería crear una matriz con una fila y n columnas para premultujar la matriz NXN. Hay rutinas para multiplicar vectores, pero creo que todos tienen el vector después de multiplicar la matriz. Si desea usar estas rutinas, tendría que hacer las transposiciones apropiadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top