multiplicacion de matrices
hola compañeros tengo un pequeño problema lo que pasa es que deseo haer una multiplicacion de matrices , funciona con matrices cuadradas pero por ejemplo con una de 3X2 y una de 2X2 marca desbordamiento en la parte donde hago precisamnete la multiplicacion de matrices.
Document : index
Created on : 04-oct-2010, 7:07:47
Author : ALUMNOA1
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>arreglo bidimencional</title>
</head>
<body>
<h1>Hello arreglo bidimencional!</h1>
<%@page import=" javax.swing.JOptionPane;"%>
<%! String StrEdad=""; %>
<% int filas=0, columnas=0, indFilas=0, indColumnas=0;//variables del arreglo A
int filasB=0, columnasB=0,indFilasB=0, indColumnasB=0;//VARIABLES DEL ARREGLO B
filas=Integer.parseInt(JOptionPane.showInputDialog("ingrese numero de FILAS"));
columnas=Integer.parseInt(JOptionPane.showInputDialog("ingrese numero de COLUMNAS"));
filasB=Integer.parseInt(JOptionPane.showInputDialog(" FILAS del arregloB deve de ser ugual a:"+columnas));
columnasB=Integer.parseInt(JOptionPane.showInputDialog("COLUMNAS del arregloB deve de ser igual a"+filas));
while(columnas!=filasB)//RECORDEMOS QUE TANTO LAS COLUMNAS DE A DEVEN DE SER IGUAL A FILAS DE B B
{
JOptionPane.showMessageDialog(null," FILAS del arregloB deve de ser igual a:"+columnas);
filasB=Integer.parseInt(JOptionPane.showInputDialog(" FILAS del arregloB deve de ser ugual a:"+columnas));
columnasB=Integer.parseInt(JOptionPane.showInputDialog("COLUMNAS del arregloB deve de ser igual a"+filas));
}
int[][]arregloA=new int[filas][columnas];
int[][]arregloB=new int[filasB][columnasB];
for(indFilas=0;indFilas<filas;indFilas++)
{
for(indColumnas=0;indColumnas<columnas;indColumnas++)
{
arregloA[indFilas][indColumnas]=Integer.parseInt(JOptionPane.showInputDialog("valor para la coordenada["+indFilas+"-"+indColumnas+"]"));
}
}
out.println("ARREGLO BIDIMENCIONAL A:");
out.println("<h3>"+"DE ORDEN :"+filas+" X "+columnas+"<h3>");
out.println("<br>");
out.println("<table align=less border=4>");//usaremos una tabla representara mejor a la matriz
for(indFilas=0;indFilas<arregloA.length;indFilas++)
{
out.println("<tr>");//iniciamos una fila
for(indColumnas=0;indColumnas<columnas;indColumnas++)
{
out.println("<td>");
out.println(arregloA[indFilas][indColumnas]);
out.println("</td>");
}
out.println("</tr>");
}
out.println("<table>");//cerramos la tabla que estamos usando
out.println("ARREGLO BIDIMENCIONAL B:");//INICIAMOS PARA LLENAR EL SEGUNDO ARREGLO
for(indFilasB=0;indFilasB<filasB;indFilasB++)
{
for(indColumnasB=0;indColumnasB<columnasB;indColumnasB++)
{
arregloB[indFilasB][indColumnasB]=Integer.parseInt(JOptionPane.showInputDialog("valor para la coordenada["+indFilasB+"-"+indColumnasB+"]"));
}
}
out.println("<h3>"+"DE ORDEN :"+filasB+" X "+columnasB+"<h3>");
out.println("<br>");
out.println("<table align=less border=4>");//usaremos una tabla representara mejor a la matriz
for(indFilasB=0;indFilasB<arregloB.length;indFilasB++)
{
out.println("<tr>");//iniciamos una fila
for(indColumnasB=0;indColumnasB<columnasB;indColumnasB++)
{
out.println("<td>");
out.println(arregloB[indFilasB][indColumnasB]);
out.println("</td>");
}
out.println("</tr>");
}
out.println("<table>");//cerramos la tabla que estamos usando
%>
<b><h1>
int j=0, k=0, i=0;
int [][]arregloC=new int [filas][columnasB];//declaramos nuestra matriz resultande con el numero de filas de a y el numero de columnas de c
for(i=0; i<filas; i++)
{
for(j=0; j<columnasB; j++)
{
for(k=0; k<columnasB; k++)
{
arregloC[j][i]=arregloC[j][i]+(arregloA[i][k]*arregloB[k][j]);
}
}
}
%>
<%//imprimir el arreglo c
out.println("matriz resultante:");//imprimismo la matriz resultante
out.println("<h3>"+"matriz resultante de orden: "+filas+" X "+columnasB+"<h3>");
out.println("<table align=CENTER border=4>");//usaremos una tabla representara mejor a la matriz
for(indFilasB=0;indFilasB<filas;indFilasB++)
{
out.println("<tr>");//iniciamos una fila
for(indColumnasB=0;indColumnasB<columnasB;indColumnasB++)
{
out.println("<td>");
out.println(arregloC[indFilasB][indColumnasB]);
out.println("</td>");
}
out.println("</tr>");//cerramos la fila
}
out.println("<table>");//cerramos la tabla que estamos usando
%>
</body>
</html>
- meztor's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
RTFS
Y la excepcion con su stacktrace apa?
Estado HTTP 500 - type
Estado HTTP 500 -
type Informe de Excepción
mensaje
descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.
excepción
org.apache.jasper.JasperException: Ha sucedido una excepción al procesar la página JSP /index.jsp en línea 89
86: {
87: for(k=0; k
Completa por favor
La stacktrace completa por favor
org.apache.jasper.JasperExcep
org.apache.jasper.JasperException: Ha sucedido una excepción al procesar la página JSP /index.jsp en línea 89
86: {
87: for(k=0; k
Invariantes, Aserciones, Design by Contract
Mmm, puesto que no me has podido proporcionar mas que el inicio de tu stacktrace, y el fragmento que me has presentado parece indicar que el problema esta en la linea 89 el modo que se me ocurre para resolver el problema es el siguiente:
Linea 89:
arregloC[j][i]=arregloC[j][i]+(arregloA[i][k]*arregloB[k][j]);
Contexto en el que se ejecuta
for(i=0; i<filas; i++)
{
for(j=0; j<columnasB; j++)
{
for(k=0; k<columnasB; k++)
{
arregloC[j][i]=arregloC[j][i]+(arregloA[i][k]*arregloB[k][j]);
}
}
}
Mi teoria es que los valores de las variable j, i y k están violando las invariantes de tu algoritmo. Las inveriantes son ciertas condiciones que deben ser verdad, en este caso, la estructura de tu arreglo. Como saber que invariantes estas violando? pues muy fácil, inviertes las invariantes, y las conviertes en: "condiciones que no deben cumplirse jamas" y las agregas a tu algoritmo, a continuación un ejemplo de algunas:
for(i=0; i<filas; i++)
{
for(j=0; j<columnasB; j++)
{
for(k=0; k<columnasB; k++)
{
if(j>=filas) throw new IllegalStateException ("el valor de j"+j+" excede filas"+filas+"y eso no deberia pasar");
if(i>=filas) throw new IllegalStateException ("el valor de i"+i+" excede columnasB"+columnasB+"y eso no deberia pasar");
if(k<=columnas) throw new IllegalStateException ("el valor de k"+k+" excede columnas"+columnas+"y eso no deberia pasar");
// y otras condiciones que nunca deben cumplirse
arregloC[j][i]=arregloC[j][i]+(arregloA[i][k]*arregloB[k][j]);
}
}
}
de esa manera, si "i" excede a "filas", el programa te lo informara claramente, y así para cada una de las variables en tu ciclo, hay valores que de alcanzarse indicarian un error en tu algoritmo, utilizar código de basado en invariantes hace tu código mas fácil de leer, mas fácil de mantener, y mas fácil de corregir en caso de tener un error. Otro nombre de esta técnica es "usar aserciones" o tambien design by contract.
Ademas de poder hacerlo con condicionales y lanzando excepciones cuando violas la invariante, otro modo de hacer es con la palabra clave assert, una peculiaridad de assert es que las invariantes escritas con assert puede des-habilitarse por configuración para mejorar el rendimiento una ves que estas "seguro" de que tu código esta bien y ya lo puedes poner en producción (alguanas personas creen que esa característica es mala idea por que es precisamente en producción cuando podrías querer saber la naturaleza exacta del problema).
Un lenguaje que hace uso extensivo de invariantes, pre-condiciones, pos-condiciones y aserciones es Eiffel
gracias
gracias si ya inverti las variables y cheque que una incumplia con el algortimo al final queda asi
int j=0, k=0, i=0;
int [][]arregloC=new int [filas][columnasB];//declaramos nuestra matriz resultande con el numero de filas de a y el numero de columnas de c
for(i=0; i<filas; i++)
{
for(j=0; j<columnasB; j++)
{
for(k=0; k<columnas; k++)
{
arregloC[i][j]=arregloC[i][j]+(arregloA[i][k]*arregloB[k][j]);
}
}
}
%>
la parte de columnasB no tenia nada que ver pues K controla que no se pase del numero de columnas de A Y/O Filas de B.
y eso de las invariables es algo que me va servir gracias por su ayuda.