Suma de columnas de matriz mxn

Iniciado por ~H~, 14 Octubre 2013, 00:37 AM

0 Miembros y 1 Visitante están viendo este tema.

~H~

El método sum tiene un parámetro (mat) que es una array bidimensional de elementos de tipo float. El parámetro mat representa una matriz de n x m elementos. Complete el método para que devuelva un array monodimensional de m elementos de tipo de tipo float que represente la suma vectorial de las n filas de la matriz mat.

La suma de n vectores es un nuevo vector en el que cada elemento es igual a la suma de los elementos que ocupan la misma posición en los vectores que se suman.

Ejemplo:
1 2 3 4
0 1 1 2
2 3 1 1   resultado   3 6 5 7


Bueno yo lo he echo así, pero en concreto lo que no entiendo es esto
float[] myArray = new float [mat[0].length];
lo de mat[0].length significa que declaro ese array y tiene la longuitud de la primera dimensión en 0??
Esque eso no lo entiendo si alguien sabe explicarlo bien y de una manera sencilla que me lo diga porfavor.

public class Excercise {
public static float[] sum(float[][] mat) {
float[] myArray = new float [mat[0].length];

for(int i = 0; i < mat[0].length; i++){
   float suma = 0;
   for(int j = 0; j < mat.length; j++){
       suma += mat[j][i];
       
       
       
       }
       myArray[i] = suma;
       
   }
 
return myArray;
}
}

ThinkByYourself

#1
Efectivamente, estás declarando que la longitud de myArray es la misma que la longitud del primer (y último, y la de los del medio igual) array metido como argumento al método (o sea la longitud del primer array de arrays), o, en otras palabras, estás diciendo que la solución tendrá el mismo número de dígitos que el primer número de la suma (y el último, y todos los que haya en medio). Pues que si tú vas a querer sumar 1582 9856 555550, en realidad tendrás:
001582
009856
555550
Y tu resultado tendrá que tener tantos dígitos como dígitos cualquiera de los números de la suma, afirmación no necesariamente cierta.
No es necesariamente cierto porque suele pasar que una suma tenga más dígitos que los... "sumandos?", bueno no sé, pero con un 5+5 tu programa tendría conflictos.
Ah, y no entiendo porque usas float si en el caso expuesto sólo hay enteros.
Ah, y también he supuesto que en cada índice de array va a haber solamente 1 cifra, y quizá no debiera.... pero bueno, espero que lo hayas entendido un poco más.
Espero que te haya servido la respuesta. Eeeeeenga ahí esos estudios
PD: también puede ser que no haya entendido nada... pro weno.
No te voy a engañar.
Todos hemos sido programados para normalizar la psicopatía de las élites económicas y políticas, y para realimentar su patrón de ciega codicia.

Mitsu

#2
Complementando la respuesta de NoBullShit, primero, te dejo un code de ejemplo:

Código (=java) [Seleccionar]

import javax.swing.SwingUtilities;

public class SumaMatrizToArray {

   double[][] matriz = {{4.5,34.6,19,75},{6.5,8.4,9.1},{11.55,9.52,23.50}};
   
   public SumaMatrizToArray(){
       double[] sumaElementosMatriz = getSumaFilasMatriz(matriz);
   
       System.out.println("Suma de las filas de la matriz en un array:\n\n");
       
       for(short indice=0; indice<sumaElementosMatriz.length; indice++) {
           System.out.println("Suma n° "+(indice+1)+":\t"+sumaElementosMatriz[indice]);
       }
  }
   
   public static double[] getSumaFilasMatriz(double[][] matriz){
double[] sumaFilasMatriz = new double[matriz.length]; // longitud array = #filas de la matriz

// inicializa los elementos del array
for(int indice=0; indice<sumaFilasMatriz.length; indice++) {
sumaFilasMatriz[indice] = 0;
}
// recorre la matriz. La suma de los elementos de cada fila
// la guarda en una posicion del array
for(short fila=0; fila<matriz.length; fila++) {
for(short columna=0; columna<matriz[fila].length; columna++) {
sumaFilasMatriz[fila] += matriz[fila][columna];
}
}
return sumaFilasMatriz;
   }
   public static void main(String... args){
       SwingUtilities.invokeLater(new Runnable(){
           @Override public void run(){
               new SumaMatrizToArray();
           }
       });

   }
}



Veamos el método getSumaFilasMatriz(doube[][] matriz):

Código (=java) [Seleccionar]

// inicializa los elementos del array
for(int indice=0; indice<sumaFilasMatriz.length; indice++) {
sumaFilasMatriz[indice] = 0;
}


Este loop, lo que hace es inicializar todos los elementos de nuestro array que contendrá la sumatoria de las filas de la matriz, en 0.

Lo inicializamos en 0, porque en otro loop en donde almacenaremos las sumatorias de las filas de la matriz, en este array; utilizaremos:


sumaFilasMatriz[fila] += matriz[fila][columna];


Si hicieramos esto sin inicializar el arreglo sumaFilasMatriz, simplemente nos tiraría un hermoso NullPointerException, que explicado, significa, que se está queriendo acceder a un valor que no existe, es decir, un valor null.

Citar
Por defecto todo objeto sin incializar, tiene el valor null.

Ahora, solo falta almacenar las sumas de las filas de la matriz, en una determinada posición de nuestro array:

Código (=java) [Seleccionar]

// recorre la matriz. La suma de los elementos de cada fila
// la guarda en una posicion del array
for(short fila=0; fila<matriz.length; fila++) {
for(short columna=0; columna<matriz[fila].length; columna++) {
sumaFilasMatriz[fila] += matriz[fila][columna];
}
}
return sumaFilasMatriz;
   }


Nota: usamos el operador += para que en cada iteración del bucle interno, se sume la columna actual de la matriz, a la suma que ya se tiene en la posición[fila] del  array.



~H~

Gracias ya entendí todo el código, sólo tenía la duda de que significaba mat[0].length, ahora que se que devuelve el número de columnas de la primera fila ya lo entiendo todo, gracias por las explicaciones.

zonahurbana

Cita de: ~H~ en 19 Octubre 2013, 00:19 AM
Gracias ya entendí todo el código, sólo tenía la duda de que significaba mat[0].length, ahora que se que devuelve el número de columnas de la primera fila ya lo entiendo todo, gracias por las explicaciones.
Es decir, ¿sería lo mismo si se usará mat[1], mat[2] u otro número siempre que no se exceda mat.length-1?
Ya que, mat.length es la cantidad de filas de la matriz, ¿verdad?
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

~H~

#5
Cita de: zonahurbana en 19 Octubre 2013, 21:40 PM
Es decir, ¿sería lo mismo si se usará mat[1], mat[2] u otro número siempre que no se exceda mat.length-1?
Ya que, mat.length es la cantidad de filas de la matriz, ¿verdad?
No entiendo muy bien tu pregunta, mat.length es la cantidad de filas de la "matriz", sí, pero eso es un método, se supone que esta diseñado para que funcione sean los valores que sean los de las filas y las columnas.
Es decir funciona para valores cualesquiera que le pases tú desde la clase principal main por teclado, claro que habría que crear la clase main

zonahurbana

mat.length devolvería la cantidad de filas de una matriz bidimensional mat, y la cantidad de elementos si se tratase de un vector.

mat[0].length devuelve la cantidad de elementos de la fila 0 de la matriz mat, es decir, la cantidad de columnas de mat. Yo preguntaba si es lo mismo usar mat[0], mat[1], y así con cualquier mat donde i<mat.length

Es que, hasta antes, yo sólo había visto vectores. Y pensaba que para matrices existía algo como mat.height para las columnas  :silbar:
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Mitsu

#7
No hay por qué confundirse.

Sea conjunto una matriz de 3 x 3:

Código (=java) [Seleccionar]

Integer[][] conjunto = new Integer[3][3];


Supongamos que queremos saber cuantas filas tiene dicha matriz:

Código (=java) [Seleccionar]

int cantidad_filas = conjunto.length;


Ahora, queremos saber cuántas columnas tiene la fila 2:

Código (=java) [Seleccionar]

int cantidad_columnas = conjunto[1].length; // pongo 1 porque la primera fila es 0



Generalmente arrays sean unidimensionales o bidimensionales, no se usan a la hora de desarrollar. Se usan Colecciones.

Dirán por qué, bueno, una de las grandes razones es que cuando usamos arreglos, debemos saber de antemano cuantos elementos tendrá dicho arreglo, pero supongamos que vamos a recuperar datos, pero no sabemos con exactitud cuántos valores va a devolver. Entonces, en estos casos se usa una colección.

Esta puede ser una Lista, un ArrayList, LinkedList, Map, HashMap, etc. Una colección no tiene un tamaño límite, está prácticamente limitado por la memoria del ordenador, lo cual es una ventaja. Además en una ArrayList - por ejemplo -, podemos guardar distintos tipos de datos, podemos guardar TODO. Si ven el método add de ArrayList, verán que recibe un Object, y como saben, todo en Java hereda de Object.

También podemos asegurarnos que una colección sea de un tipo especificado, utilizando Generics, pero ese es otro tema.

~H~

Muchas gracias por la explicación!