C#: Ayuda con Matrices Triangulares

hapu

Lanero Novato
29 Oct 2006
4
Antes q nada gracias
soy nuevo en esto
de los foros y la progrmacion
mi problema es q debo almacenar una matris de n x n triangular (la mitad son ceros)
en un arreglo sin los ceros
por ejemplo

4 0 3 6
0 9 2 8
0 0 1 5
0 0 0 7

4
0
3
6
9
2
8
1
5
7

tengo unas formulas
pero no supe usarlas

Matriz triangular superior

Recuperar a matriz[i,j] = POSINI +(i-1)*i/2 +(j-i)
POSINI se considera que inicia de uno


matriz[i,j] 0 PosIni +(MAXimodel arrreglo (i-1)-(((i-2)*(i-1))/2) +(j-i)
esa formula me dara la posicion que se tiene en el arreglo
dandole los datos i, j

gracias de nuevo
 
La verdad no le entendí muy bien a su pregunta...
pero trataré de adivinar la respuesta... :p

Suponga que las matrices siempre serán cuadradas, y que
le dan el número de columnas... por ejemplo 4.

Cuando pida la posición [j] de la matriz, revise si i es
menor a j, si esto es cierto regrese un 0, de otro modo
utilice la fórmula que le dieron...

Espero haber sido de ayuda... :p
 
las matrices triangulares son como las normales solo q los valores de la diagonal para arriba o abajo son ceros

la formula es la q no entendi
gracias por contestarme de todos modos
 
Creo que hay algo malo en la fórmula que está posteando... :S

Me gustaría que, si es tan amable, revisara si la escribió bien...

Según entiendo la fórmula debería de servirle para obtener los
datos del vector, no de la matriz... pues en la matriz se puede
ir directo... y como en el vector se omiten los valores que no
forman parte del triángulo, pues tiene que haber una forma de
obtenerlos...

Ya probé con ambas fórmulas y no se comportan como "creo"
que deberían... :S
 
aaaa gracias
es lo q yo tambien creia
puedo mandar los datos al vector
pero para regrsarlos a la matris no supe como
 
Podría utilizar un ciclo que comienze desde el último elemento
hasta los primeros... es decir que recorra el arreglo al reves y
que vaya poniendo a 0 los demás valores...

a ver... sin revisar mucho el tema, sería:
Código:
k = noElemsVector;
for( i = noRenMatriz; i >= 0; i--){
     for( j = noColMatriz; j >= 0; j--){
          if ( j >= i ){
               matriz[i][j] = vector[k];
               k--;
          }
          else
               matriz[i][j] = 0;
     }
}

En sí lo que busco es que se llene la matriz pero
comenzando desde abajo... no sé si el código de arriba
funciona... pruebelo... :)
 
Podría utilizar un ciclo que comienze desde el último elemento
hasta los primeros... es decir que recorra el arreglo al reves y
que vaya poniendo a 0 los valores de la matriz que no estén
en el arreglo... a ver... sin revisar mucho el tema, sería:
Código:
k = noElemsVector;
for( i = noRenMatriz; i >= 0; i--){
     for( j = noColMatriz; j >= 0; j--){
          if ( j >= i ){
               matriz[i][j] = vector[k];
               k--;
          }
          else
               matriz[i][j] = 0;
     }
}
En sí lo que busco es que se llene la matriz pero
comenzando desde abajo... no sé si el código de arriba
funciona... pruebelo... :)

Editado:
Bueno... no me pude aguantar las ganas de probar el código...
funciona con unas simples correcciones...

Código:
k = noElemsVector-1;
for( i = noRenMatriz-1; i >= 0; i--){
     for( j = noColMatriz-1; j >= 0; j--){
          if ( j >= i ){
               matriz[i][j] = vector[k];
               k--;
          }
          else
               matriz[i][j] = 0;
     }
}

Si le dicen que debía utilizar la fórmula, les dice que unos
cuantos ifs, son más rápidos que hacer las multiplicaciones
y divisiones de la fórmula... no se crea, no se los diga... :p