una duda simple. como hallar el maximo de una columna

Iniciado por XpandyX, 27 Septiembre 2010, 02:44 AM

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

XpandyX

Hola espero que me puedan ayudar la cuestion es que he venido haciendo una matriz en C# y con lo cual me tope con una duda muy grande bueno intente resolverla de muchas maneras "Se trata de como hallar el maximo de una sola columna"
Mi matriz es de esta manera


           Columna1   Columna2   Columna3
fila 1         10               80              10
fila 2           0                0               10
fila 3           1                0               10
fila 4           2              100             10
fila 5           3               50              10
fila 6           5               20              10
fila 7          80              30              10
fila 8          15              40              12
fila 9          84              50              80
fila 10        10              10              100


bueno los valores no importan tanto, solo como puedo hallar el maximo de cada columna? he intentadp recorriendo pero el caso es que no encuentro la manera.


Código (csharp) [Seleccionar]
Maximo = vector[0,0];
for(i=0;i<Filas;i++)
   {
         for(j=0;j<columnas;j++)
             {
                    supongo que tambien se utilizara un.
                    if(vector[i,j]>Maximo)      
                     Maximo=Vector[i,j];
              }          
    }


Supongo que de esa manera seria? pero en todo caso me sale el maximo de toda la matriz. o talvez se hace de otra manera en la cual se recorre primero el "j" y luego el "i"?, tambien estuve pensando en un vector simple el cual me guarde el maximo de cada columna pero no me sale. Espero que puedan ayudarme. Saludos y gracias de antemano.

Ari Slash

basta con agregar una condicion mas a ese IF

si vector i,j es mayor al maximo && j es igual a 1, entonces maximo es igual a vector i,j  //comentario, 1 se refiere a columna 1


no se C#  ;D


saludos

[L]ord [R]NA


[D4N93R]

Los códigos por favor dentro de [code=csharp][/code]

Un saludo

seba123neo

Hola, podrias usar un ordenamiento para arrays con multiples dimensiones, o sea como usar .Sort , pero como esta solo funciona para una dimensión, podes usar la Interface IComparer.

aca te pongo un ejemplo de una matriz con 2 dimensiones y como ordena los elementos de cada una...vos adaptalo a tu ejemplo..y pasalo a C#...si no podes te ayudo.

Código (vbnet) [Seleccionar]
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim vNumeros(,) As Integer = {{33, 12}, {12, 10}, {13, 5}, {27, 19}}
        Dim tagArray() As Integer = {0, 1, 2, 3}

        Dim myComparer As New RectangularComparer(vNumeros)
        myComparer.vDimension = 0
        Array.Sort(tagArray, myComparer)

        'Primera Dimensión

        For i As Integer = 0 To tagArray.Length - 1
            Debug.WriteLine(vNumeros(tagArray(i), 0))
        Next

        Debug.WriteLine("")

        myComparer.vDimension = 1
        Array.Sort(tagArray, myComparer)

        'Segunda Dimensión
        For i As Integer = 0 To tagArray.Length - 1
            Debug.WriteLine(vNumeros(tagArray(i), 1))
        Next
    End Sub
End Class

Class RectangularComparer
    Implements IComparer

    Public vDimension As Integer
    Private sortArray(,) As Integer

    Public Sub New(ByVal theArray(,) As Integer)
        sortArray = theArray
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare

        Dim i1 As Integer = DirectCast(x, Integer)
        Dim i2 As Integer = DirectCast(y, Integer)

        Return sortArray(i1, vDimension).CompareTo(sortArray(i2, vDimension))
    End Function
End Class


lo que hace es llenar un array de 2 dimensiones con algunos valores, despues llama a esta clase que ordena los numeros para la dimensión que quieras y luego te imprime los valores ordenados.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

XpandyX

Cita de: Ari-Slash en 27 Septiembre 2010, 02:57 AM
basta con agregar una condicion mas a ese IF

si vector i,j es mayor al maximo && j es igual a 1, entonces maximo es igual a vector i,j  //comentario, 1 se refiere a columna 1


no se C#  ;D


saludos

Hola gracias por responder bueno la verdad pense qeu iva a funcionar lo que me dijiste pero al cuestion es que cuando hago aquello pos me dice que nos e puede convertir implicitamente el tipo int en tipo bool y la verda dno se como  seria..... espero me respondas :D


XpandyX

Cita de: Lord R.N.A. en 27 Septiembre 2010, 03:51 AM
La longitud es fija o es dinamica?


Hola es bueno si te refieres a eso si es fija :D gracias por responder

XpandyX

Cita de: seba123neo en 27 Septiembre 2010, 04:18 AM
Hola, podrias usar un ordenamiento para arrays con multiples dimensiones, o sea como usar .Sort , pero como esta solo funciona para una dimensión, podes usar la Interface IComparer.

aca te pongo un ejemplo de una matriz con 2 dimensiones y como ordena los elementos de cada una...vos adaptalo a tu ejemplo..y pasalo a C#...si no podes te ayudo.

Código (vbnet) [Seleccionar]
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim vNumeros(,) As Integer = {{33, 12}, {12, 10}, {13, 5}, {27, 19}}
        Dim tagArray() As Integer = {0, 1, 2, 3}

        Dim myComparer As New RectangularComparer(vNumeros)
        myComparer.vDimension = 0
        Array.Sort(tagArray, myComparer)

        'Primera Dimensión

        For i As Integer = 0 To tagArray.Length - 1
            Debug.WriteLine(vNumeros(tagArray(i), 0))
        Next

        Debug.WriteLine("")

        myComparer.vDimension = 1
        Array.Sort(tagArray, myComparer)

        'Segunda Dimensión
        For i As Integer = 0 To tagArray.Length - 1
            Debug.WriteLine(vNumeros(tagArray(i), 1))
        Next
    End Sub
End Class

Class RectangularComparer
    Implements IComparer

    Public vDimension As Integer
    Private sortArray(,) As Integer

    Public Sub New(ByVal theArray(,) As Integer)
        sortArray = theArray
    End Sub

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare

        Dim i1 As Integer = DirectCast(x, Integer)
        Dim i2 As Integer = DirectCast(y, Integer)

        Return sortArray(i1, vDimension).CompareTo(sortArray(i2, vDimension))
    End Function
End Class


lo que hace es llenar un array de 2 dimensiones con algunos valores, despues llama a esta clase que ordena los numeros para la dimensión que quieras y luego te imprime los valores ordenados.

saludos.


Hola gracias por responder la verdad entendi muy poco del codigo por qeu recien esot aprendiendo y en C# y bueno la verdad nose como seria eso en C#. intente otros metodos pero nada. espero y me respondan porfa.

Saludos

Siuto

#8
Tu algoritmo te da el maximo de la matriz porque la esta recorriendo entera y nunca para hasta terminar.


Código (csharp, 3,10) [Seleccionar]

for(i=0;i<Columnas;i++)
{
   Maximo = 0 // Si son todos valores positivos podes ponerlo en 0

   for(j=0;j<Filas;j++)
   {
           if(vector[i,j]>Maximo) Maximo=Vector[i,j];
   }

   // Guardar/imprimir el resultado de la columna
}


Cada vez que sale del bucle mas profundo es cuando terminas una columna, en ese momento tenes el maximo de la columna. Y nota que la inicializacion de Maximo la tenes que hacer una vez por columna y no una vez por matriz.

EDIT: Intercambien las filas por columnas, porque antes recorrias la matriz por filas y no por columnas.