El 23/08/2012, a las 15:05, Horacio escribió:

> Buenas, este problema me desafía todo mi sentido común... lo que busco
> en una matriz A de NRxNR es hallar las codiagonales no nulas y su
> longitud..
> 
> AVISO: Este algoritmo funciona, lo he probado en PERL!!
> 
> Pero el siguiente código no se por qué LM y S se mantienen en cero???
> luego del ELSE: cuando s+=1 si se incrementa en 1!! como lo compruebo
> en el primer "print"  WTF!!!
> 
> d=[]
> d=[0]*NR
> LM=0
> s=0
> for c in range(5,NR):
>   s=0
>   for x in range(NR):
>       y=x+c
>       if (y<NR):
>           if (A[x][y]==1):
>               s+=1
>               print s # aca da <> 0
>           else:
>               print s,LM # aca me da s=LM=0 ???? el equivalente en
> perl me da <> 0??? WTF
>               if (s>LM):
>                   LM=s
>               d[s]+=1
>               s=0
> print "Diagonal maxima %d" % LM
> 
> Alguien me puede decir que cuernos le pasa al if??

Si lo que quieres es escribir tu propio algoritmo puedes ignorar todo el 
mensaje pero, si pudieras trabajar con numpy...

puedes encontrar la diagonal con
numpy.diagonal(a)

Si las codiagonales son las diagonales adyacentes a la diagonal principal (no 
sé cual es la definición exacta) puedes encontrarlas "recortando" tu matriz 
para convertirlas en las diagonales de las matrices "recortadas".
Codiagonal superior
cs = numpy.diagonal(a[:,1:])
Codiagonal inferior
ci = numpy.diagonal(a[1:,:])

Si lo que quieres es ver si son todo ceros puedes hacer
not cs.any()

Si lo que quieres es contar el número de elementos que no son cero puedes 
obtenerlos así
cs[cs != 0]
y contarlos con 
len(cs[cs != 0])

Aparte del ahorro en escribir algoritmos tengo la sensación de que sería más 
eficiente para matrices grandes. 

Un saludo

_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a