Newsgroup: it.comp.lang.pascal
Titolo: Rango di una matrice

Salve ! Come da oggetto, ho bisogno di una procedura/funzione per calcolare
il rango di una matrice.
Grazie a tutti coloro che mi risponderanno!!!
El Dono

 ha scritto nel messaggio
news:K5lia.3830$nD4.1...@twister1.libero.it...


> che è il rango?è una specie di scimmia?
numero di righe o colonne linearmente indipendeti
[e altre cose...]
-- 
Dreadnaut
(Life would be easier if I had the source code)

[e altre cose...]
Non č proprio semplice da fare l'algoritmo... specialmente per me ( mi
hanno bocciato al esame )
Il Razziatore,
The Only Good Windows is an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
ICQ     : 67552596
-----------------------------------------------
Founder of MediaPlayer Project
http://mpp.iwebland.com

 ha scritto nel messaggio
news:b6n5ek...@razziatore.no-ip.com...



Provo a dare una soluzione, però è ovvio che potrebbe esserci una soluzione
nettamente più semplice, d'altra parte non sono un genio in algebra lineare,
più si è bravi e più si trova una soluzione più veloce.
Comunque brevemente:
IL rango di una matrice è la dimensione del MINORE più grande con
DETERMINANTE diverso da 0.
Un MINORE è una delle possibili sottomatrici quadrate, contenute in una
qualsiasi matrice non quadrata.
IL RANGO può avere dimensione che va da 0 (Solo nel caso che la matrice sia
composta da tutti 0) a (n) se (n<m) e (m) se (m<n)
Quindi se per esempio avessimo una matrice di 3x4, il Rango sarebbe compreso
tra:
 0 e 3
Siccome i 2 (in questo caso) minori più grandi hanno dimensione 3, e 0
ovviamente perchè la matrice potrebbe avere tutti 0 e una matrice con tutti
0 è sempre lineramente dipendente e quindi anche le sottomatrici lo sono e
dunque il rango è 0 (e io speriamo che me la cavo e che non ho detto una
fregnaccia).
Fatta questa premessa.
Primo problema: Calcolare il Determinante di una Matrice quadrata M(n)
Supponendo di avere la seguente funzione che ci calcola il Determinante:
function calcola_DET(M:Array Of Integer; n:Integer):Integer;
supponiamo che funzioni.
IL problema si riduce a controllare ricorsivamente tutti i Minori da quelli
più grandi a quelli di dimensione 1, fino a quando non ne troviamo 1 con Det
<> 0 oppure non esitono minori più piccoli (minori di dimensione 0, non
esistono)
quindi bisogna fare una funzione del tipo:
function calcola_DET_MINORE(M:Array Of Integer; n:Integer):Integer;
supponiamo di averla fatta, ci serve un'ultima funzione:
function calcola_RANGO(M:Array Of Integer; m,n:Integer):Integer;

ritrattando meglio quello che ho detto ho detto, bisogna prima stabilire
come strutturare una Matrice, penso che con i Puntatori sia meglio, quindi:
Supponendo di strutturare una matrice in questo modo:
Type
  Matrice^=StrutturaMatrice;
  StrutturaMatrice=Record
    Mat:Array[1..10000] Of Integer;    { Massimo n*m=10000 elementi
significa che si possono creare matrici variabili. n*m }
    n,m:Integer;
  End;
{ bisogna fare 2 funzioni per la creazione, lettura e distruzione della
matrice, ma queste sono semplici }
function calcola_RANGO(M:Matrice m,n:Integer):Integer;
  Var I,Rango:Integer;
        SubM:Matrice;
  begin
     Rango:=0;
     if (m<n) then
      begin
         I:=0;
         while ((m+I)<n)  OR (Rango<>0) do
           begin
              Create_Matrice_Quadrata(SubM,m);
              Copy_Sub_Matrice(SubM,M,I,0,m);
              Rango:=calcola_RANGO_MINORE(SubM,m);
              Destroy_Matrice_Quadrata(SubM);
              I:=I+1;
           end;
      end else
      begin
         I:=0;
         while ((n+I)<m)  OR (Rango<>0) do
           begin
              Create_Matrice_Quadrata(SubM,n);
              Copy_Sub_Matrice(SubM,M,0,I,n);
              Rango:=calcola_RANGO_MINORE(SubM,n);
              Destroy_Matrice_Quadrata(SubM);
              I:=I+1;
           end;
     end;
    calcola_RANGO:=Rango;
  end;

A questo punto serve solo la funzione per il calcolo del Rango di un Minore,
siccome il Minore è una matrice Quadrata, basta ridurre a Gradini il Minore
tramite il Metodo/Algoritmo di Gauss, e poi contare i gradini.
IL numero di Gradini è il rango della Matrice.
Questo metodo non è uguale a quello che avevo pensato, questo è migliore,
infatti basta solo trasformare la Matrice in una matrice diagonale e poi
contare i gradini.
L'altro metodo è proibitivo, questa funzione è quella richiamata dalla
funzione precedente, ovvero:
calcola_RANGO_MINORE(SubM,n)

> IL numero di Gradini è il rango della Matrice.
Infatti per esempio:
1 0 0
0 1 0
0000
Ha 2 gradini e il rango è 2 e si trova.
1 0 1 0
0 1 0 0
0 0 1 1
0 0 0 8
Rango 4, ci sono 4 gradini.
Quindi basta contare i gradini dei Minori ridotti a matrici diagonali.

 hanno bocciato al esame )
                 ^^^^^^^^
Anche a quello di italiano? :)
ciao, Nids

 penseranno!
Per calcolare il rango di una matrice potresti
applicare l'eliminazione di Gauss con pivoting totale
(l'algoritmo e' molto semplice, se vuoi te lo
scrivo in pseudocodice) e controllare il numero di
righe non nulle. Tale numero rappresenta il rango
della matrice di partenza.
Almeno mi pare... :))
Bye
PS: Chiedo scusa per eventuali post multipli,
ho avuto qualche problema col newsreader...

 ha scritto nel messaggio
news:K5lia.3830$nD4.1...@twister1.libero.it...

forse intendi il range...
cmq se dovesse essere cosi', ci sono delle funzioni, low ed high, che
restituiscono i valori minori e maggiori di un array
--
Ciao
Gianfranco Marchese
e-mail dgruma@NOPUBBLICITA'
tin.it
 (Da togliere NOPUBBLICITA' se vuoi
rispondermi in privato)
sito internet personale: 
http://www.turbo-pascal.cjb.net
  Tutto sul Turbo
Pascal  1.5

forse intendi il range...
No no intende proprio il Rango... se non sai cosa è sono contento per
te... e una cosa moooolto brutta... visto che vuol dire ke hai fatto
l'esame di Algebra Lineare & Geometria brr mi vengono ancora i brividi
a pensare al Krn e al Img...  Meglio pernsare che lunedi alle 10 ho
Fdi... si meglio...
