Matrice.h v2.0

Soyez le premier à donner votre avis sur cette source.

Vue 5 436 fois - Téléchargée 141 fois

Description

Cet addon a pour but d'introduir une nouvel objet dans le mirc : les matrices.
Vous disposez donc dans cet equivalent de "librairie" d'une belle baterie de fonctions .
Elles vont vous permettre d'exploiter les matrices tant au niveau mathématique avec les inverses les déterminants la transposée, mais aussi au niveau stockage de donnée avec des outils de redimensionnement ,d'interversion et bien d'autre.

les intructions et les syntaxes relatives a l'utilisation des fonctions ainsi que la source sont dans le zip.

Pour l'instant il n'y a pas d'inerface comme math.h, cela pourrait changer...

Source / Exemple :


alias type_mat { if ( $find_mat($1) = false ) { halt } | return $readini(matrice.ini,n,$2,type) }
alias find_mat { if ($readini(matrice.ini,n,$1,type)) { return true } | else { return false } }
alias ian { var %itr = 1 | new_mat $1 identité $2 $2 | while ( %itr <= $2 ) { set_mat $1 %itr %itr $3 | inc %itr } }
alias del_mat { var %itr = 1 | while ( $gettok($1-,%itr,32) ) { if ( $find_mat($ifmatch) = true ) { remini matrice.ini $gettok($1-,%itr,32) } | inc %itr } }
alias set_type_mat { writeini -n matrice.ini $1 type $2- }
alias set_dim_mat { writeini -n matrice.ini $1 dimension $+($2,$chr(44),$3) }

alias get_mat {
  if ( $find_mat($1) = false ) { halt } 
  if ( $2 > $dim_mat(l,$1) ) || ( $3 > $dim_mat(c,$1) ) { halt }
  return $gettok($readini(matrice.ini,n,$1,l $+ $2),$3,160)
}

alias set_mat { 
  if ( $2 > $dim_mat(l,$1) ) || ( $3 > $dim_mat(c,$1) ) { echo -a [Erreur] votre entrée ne correspond pas a la dimension de la matrice | halt }
  if ( $find_mat($1) = false ) { halt }
  if ( $3 = 1 ) { writeini -n matrice.ini $1 l $+ $2 $4 $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ $2),2-,160) }
  else { writeini -n matrice.ini $1 l $+ $2 $gettok($readini(matrice.ini,n,$1,l $+ $2),1- $+ $calc($3 -1),160) $+ $chr(160) $+ $4 $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ $2),$calc($3 +1) $+ -,160) }
}

alias dim_mat { 
  if ( $1 = l ) && ( $find_mat($2) = true ) { return $gettok($readini(matrice.ini,n,$2,dimension),1,44) }
  elseif ( $1 = c ) && ( $find_mat($2) = true ) { return $gettok($readini(matrice.ini,n,$2,dimension),2,44) }
  elseif ( $find_mat($1) = true ) && ( !$2 ) { return $replace($readini(matrice.ini,n,$1,dimension),$chr(44),$chr(32)) }
}

alias new_mat { 
  var %itr = 1
  writeini -n matrice.ini $1 type $2
  writeini -n matrice.ini $1 dimension $3 $+ , $+ $4
  while ( %itr <= $dim_mat(l,$1) ) { writeini -n matrice.ini $1 l $+ %itr $str(0 $+ $chr(160),$dim_mat(c,$1)) | inc %itr }
}

alias new_dim_mat {
  if ( $1 = l ) { 
    if ( $find_mat($2) = false ) { halt }
    if ( $3 > $dim_mat(l,$2) ) { var %itr = $calc($dim_mat(l,$2) +1) | while ( %itr <= $3 ) { writeini -n matrice.ini $2 l $+ %itr $str(0 $+ $chr(160),$dim_mat(c,$2)) | inc %itr } }
    elseif ( $3 < $dim_mat(l,$2) ) { var %itr = $calc($3 +1) | while ( %itr <= $dim_mat(l,$2) ) { remini matrice.ini $2 l $+ %itr | inc %itr } }
    writeini -n matrice.ini $2 dimension $3 $+ , $+ $dim_mat(c,$2)
  }
  elseif ( $1 = c ) { 
    if ( $find_mat($2) = false ) { halt }
    if ( $3 > $dim_mat(c,$2) ) { var %itr = 1 | while ( %itr <= $dim_mat(l,$2) ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$2,l $+ %itr) $+ $str(0 $+ $chr(160),$calc($3 - $dim_mat(c,$2))) | inc %itr } }
    elseif ( $3 < $dim_mat(c,$2) ) { var %itr = 1 | while ( %itr <= $dim_mat(l,$2) ) { writeini -n matrice.ini $2 l $+ %itr $gettok($readini(matrice.ini,n,$2,l $+ %itr),1 $+ - $+ $3,160) $+ $chr(160) | inc %itr } }
    writeini -n matrice.ini $2 dimension $dim_mat(l,$2) $+ , $+ $3
  }
  else { 
    if ( $find_mat($1) = false ) { halt }
    if ( $2 > $dim_mat(l,$1) ) { var %itr = $calc($dim_mat(l,$1) +1) | while ( %itr <= $2 ) { writeini -n matrice.ini $1 l $+ %itr $str(0 $+ $chr(160),$3) | inc %itr } }
    elseif ( $2 < $dim_mat(l,$1) ) { var %itr = $calc($2 +1) | while ( %itr <= $dim_mat(l,$1) ) { remini matrice.ini $1 l $+ %itr | inc %itr } }
    writeini -n matrice.ini $1 dimension $2 $+ , $+ $dim_mat(c,$1)
    if ( $3 > $dim_mat(c,$1) ) { var %itr = 1 | while ( %itr <= $dim_mat(l,$1) ) { writeini -n matrice.ini $1 l $+ %itr $readini(matrice.ini,n,$1,l $+ %itr) $+ $str(0 $+ $chr(160),$calc($3 - $dim_mat(c,$1))) | inc %itr } }
    elseif ( $3 < $dim_mat(c,$1) ) { var %itr = 1 | while ( %itr <= $dim_mat(l,$1) ) { writeini -n matrice.ini $1 l $+ %itr $gettok($readini(matrice.ini,n,$1,l $+ %itr),1 $+ - $+ $3,160) $+ $chr(160) | inc %itr } }
    writeini -n matrice.ini $1 dimension $dim_mat(l,$1) $+ , $+ $3
  }
}

alias get_col_mat {
  if ( $find_mat($1) = false ) { halt }
  if ( $3 > $dim_mat(c,$1) ) { halt }
  var %itr = 1
  writeini -n matrice.ini $2 type colone $3 de $1
  writeini -n matrice.ini $2 dimension $dim_mat(l,$1) $+ ,1
  while ( %itr <= $dim_mat(l,$1) ) { writeini -n matrice.ini $2 l $+ %itr $gettok($readini(matrice.ini,n,$1,l $+ %itr),$3,160) | inc %itr }
}

alias get_lig_mat {
  if ( $find_mat($1) = false ) { halt }
  if ( $3 > $dim_mat(l,$1) ) { halt }
  writeini -n matrice.ini $2 type ligne $3 de $1
  writeini -n matrice.ini $2 dimension 1, $+ $dim_mat(c,$1)
  writeini -n matrice.ini $2 l1 $readini(matrice.ini,n,$1,l $+ $3)
}

alias del_col_mat { 
  if ( $find_mat($1) = false ) { halt }
  if ( $3 > $dim_mat(c,$1) ) { halt }
  var %itr = 1
  writeini -n matrice.ini $2 type $1 privée de la colone $3
  writeini -n matrice.ini $2 dimension $dim_mat(l,$1) $+ , $+ $calc($dim_mat(c,$1) -1)
  while ( %itr <= $dim_mat(l,$1)) { 
    if ( $3 = 1 ) { writeini -n matrice.ini $2 l $+ %itr $gettok($readini(matrice.ini,n,$1,l $+ %itr),2-,160) }
    else { writeini -n matrice.ini $2 l $+ %itr $gettok($readini(matrice.ini,n,$1,l $+ %itr),1- $+ $calc($3 -1),160) $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ %itr),$calc($3 +1) $+ -,160) }
    inc %itr
  }
}

alias del_lig_mat { 
  if ( $find_mat($1) = false ) { halt }
  if ( $3 > $dim_mat(l,$1) ) { halt }
  var %itr = 1
  writeini -n matrice.ini $2 type $1 privée de la ligne $3
  writeini -n matrice.ini $2 dimension $calc($dim_mat(l,$1) -1) $+ , $+ $dim_mat(c,$1)
  while ( %itr <= $dim_mat(l,$2) ) { 
    if ( %itr < $3 ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$1,l $+ %itr) }
    elseif ( %itr >= $3 ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$1,l $+ $calc(%itr +1)) }
    inc %itr
  }
}

alias set_lig_mat {
  if ( $find_mat($1) = false ) { halt }
  if ( $4 > $dim_mat(l,$1) ) { halt }
  var %itr = 1
  writeini -n matrice.ini $2 type $1 : ligne $4 changé en $3
  writeini -n matrice.ini $2 dimension $dim_mat(l,$1) $+ , $+ $dim_mat(c,$1)
  while ( %itr <= $dim_mat(l,$1) ) { 
    if ( %itr = $4 ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$3,l1) }
    else { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$1,l $+ %itr) }
    inc %itr
  }
}

alias set_col_mat { 
  if ( $find_mat($1) = false ) { halt }
  if ( $4 > $dim_mat(c,$1) ) { halt }
  var %itr = 1 
  writeini -n matrice.ini $2 type $1 colone $4 changé en $3
  writeini -n matrice.ini $2 dimension $dim_mat(l,$1) $+ , $+ $dim_mat(c,$1)
  while ( %itr <= $dim_mat(l,$1) ) { 
    if ( $4 = 1 ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$3,l $+ %itr) $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ %itr),$calc($4 +1) $+ -,160) }
    else { writeini -n matrice.ini $2 l $+ %itr $gettok($readini(matrice.ini,n,$1,l $+ %itr),1- $+ $calc($4 -1),160) $+ $chr(160) $+ $readini(matrice.ini,n,$3,l $+ %itr) $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ %itr),$calc($4 +1) $+ -,160) }
    inc %itr
  }
}

alias ins_lig_mat {
  if ( $find_mat($1) = false ) { halt }
  if ( $4 > $dim_mat(c,$1) ) { halt }
  var %itr = 1
  while ( %itr <= $dim_mat(l,$1) ) { 
    if ( %itr < $4 ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$1,l $+ %itr) }
    elseif ( %itr = $4 ) { 
      writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$3,l1)
      writeini -n matrice.ini $2 l $+ $calc(%itr +1) $readini(matrice.ini,n,$1,l $+ %itr)
    }
    else { writeini -n matrice.ini $2 l $+ $calc(%itr +1) $readini(matrice.ini,n,$1,l $+ %itr) }
    inc %itr
  }
  writeini -n matrice.ini $2 type $1 rallongée de $3 a la ligne $4
  writeini -n matrice.ini $2 dimension $calc($dim_mat(l,$1) +1) $+ , $+ $dim_mat(c,$1)
}

alias ins_col_mat {
  if ( $find_mat($1) = false ) { halt }
  if ( $4 > $dim_mat(c,$1) ) { halt }
  var %itr = 1 
  while ( %itr <= $dim_mat(l,$1) ) { 
    if ( $4 = 1 ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$3,l $+ %itr) $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ %itr),1-,160)  }
    else { writeini -n matrice.ini $2 l $+ %itr $gettok($readini(matrice.ini,n,$1,l $+ %itr),1- $+ $4,160) $+ $chr(160) $+ $readini(matrice.ini,n,$3,l $+ %itr) $+ $chr(160) $+ $gettok($readini(matrice.ini,n,$1,l $+ %itr),$calc($4 +1) $+ -,160) }
    inc %itr
  }
  writeini -n matrice.ini $2 type $1 rallongée de $3 a la colone $4
  writeini -n matrice.ini $2 dimension $dim_mat(l,$1) $+ , $+ $calc($dim_mat(c,$1) +1)
}

alias mod_ll_mat { 
  if ( $find_mat($1) = false ) { halt }
  get_lig_mat $1 ~1 $3
  get_lig_mat $1 ~2 $4
  set_lig_mat $1 $2 ~1 $4
  set_lig_mat $2 $2 ~2 $3
  set_type_mat $2 $1 : ligne $3 echangée avec $4
  del_mat ~1 ~2
}

alias mod_cc_mat { 
  if ( $find_mat($1) = false ) { halt }
  get_col_mat $1 ~1 $3
  get_col_mat $1 ~2 $4
  set_col_mat $1 $2 ~1 $4
  set_col_mat $2 $2 ~2 $3
  set_type_mat $2 $1 : colone $3 echangée avec $4
  del_mat ~1 ~2
}

alias min_mat { 
  if ( $find_mat($1) = false ) { halt }
  del_col_mat $1 ~1 $4
  del_lig_mat ~1 ~1 $3
  copy_mat $2 ~1
  del_mat ~1
  set_type_mat $2 mineur de $1 $3 $4
  set_dim_mat $2 $calc($dim_mat(l,$1) -1) $calc($dim_mat(c,$1) -1)
}

alias copy_mat { 
  var %itr = 1
  if ( $find_mat($2) = false ) { halt }
  while ( %itr <= $dim_mat(l,$2) ) { writeini -n matrice.ini $1 l $+ %itr $readini(matrice.ini,n,$2,l $+ %itr) | inc %itr }
  set_type_mat $1 $readini(matrice.ini,n,$2,type)
  set_type_mat $1 $replace($dim_mat($2),$chr(32),$chr(44))
}

alias vect_c_mat {
  var %i = 1
  while ( %i <= $dim_mat(l,$2) ) {
    var %itr = 1
    unset %ligne
    while ( $gettok($2-,%itr,32) ) { set %ligne %ligne $+ $get_mat($ifmatch,%i,1) $+ $chr(160) | inc %itr }
    writeini -n matrice.ini $1 l $+ %i %ligne
    inc %i
  }
  unset %ligne
  set_type_mat $1 matrice vect colone $2-
  set_dim_mat $1 $dim_mat(l,$2) $gettok($2-,0,32)
}

alias vect_l_mat {
  var %itr = 1
  while ( $gettok($2-,%itr,32) ) { writeini -n matrice.ini $1 l $+ %itr $readini(matrice.ini,n,$ifmatch,l1) | inc %itr }
  set_type_mat $1 matrice vect colone $2-
  set_dim_mat $1 $gettok($2-,0,32) $dim_mat(c,$2)
}

alias equal_mat {
  var %itr = 1
  var %i = 1
  if ( $dim_mat(l,$1) != $dim_mat(l,$2) ) || ( $dim_mat(c,$1) != $dim_mat(c,$2) ) { return false }
  else {
    while ( %itr <= $dim_mat(l,$1) ) { if ( $readini(matrice.ini,n,$1,l $+ %itr) = $readini(matrice.ini,n,$2,l $+ %itr) ) { inc %i } | inc %itr }
    if ( %itr = $calc(%i +1) ) { return true } | else { return false }
  }
}

alias mat_somme { 
  if ( $dim_mat(l,$1) = $dim_mat(l,$2) ) || ( $dim_mat(c,$1) = $dim_mat(c,$2) ) { 
    var %i = 1
    while ( %i <= $dim_mat(l,$1) ) {
      var %itr = 1
      unset %ligne
      while ( %itr <= $dim_mat(c,$1) ) { set %ligne %ligne $+ $calc($get_mat($1,%itr,%i) + $get_mat($2,%itr,%i)) $+ $chr(160) | inc %itr }
      writeini -n matrice.ini $3 l $+ %i %ligne
      inc %i
    }
    unset %ligne
    set_type_mat $3 matrice somme $1 + $2
    set_dim_mat $3 $dim_mat(l,$1) $dim_mat(c,$1) 
  }
  else { echo -a [Erreur] matrice incompatible }
}

mat_diff {
  if ( $dim_mat(l,$1) = $dim_mat(l,$2) ) || ( $dim_mat(c,$1) = $dim_mat(c,$2) ) { 
    var %i = 1
    while ( %i <= $dim_mat(l,$1) ) {
      var %itr = 1
      unset %ligne
      while ( %itr <= $dim_mat(c,$1) ) { set %ligne %ligne $+ $calc($get_mat($1,%itr,%i) - $get_mat($2,%itr,%i)) $+ $chr(160) | inc %itr }
      writeini -n matrice.ini $3 l $+ %i %ligne
      inc %i
    }
    unset %ligne
    set_type_mat $3 matrice somme $1 - $2
    set_dim_mat $3 $dim_mat(l,$1) $dim_mat(c,$1) 
  }
  else { echo -a [Erreur] matrice incompatible }
}

alias mat_transpose { 
  var %i = 1
  if ( $dim_mat(l,$1) = $dim_mat(c,$1) ) {
    while ( %i <= $dim_mat(l,$1) ) {
      var %itr = 1
      while ( %itr <= $dim_mat(c,$1) ) { writeini -n matrice.ini $2 l $+ %itr $readini(matrice.ini,n,$2,l $+ %itr) $+ $get_mat($1,%i,%itr) $+ $chr(160) | inc %itr } 
      inc %i
    }
    set_type_mat $2 matrice transposée de $1
    set_dim_mat $2 $dim_mat(c,$1) $dim_mat(l,$1)  
  }
}

alias mat_det {
  var %itr = 1
  unset %ligne
  if ( $dim_mat(l,$1) = $dim_mat(c,$1) ) {
    while ( %itr <= $dim_mat(l,$1)) { 
      set %ligne %ligne $+ $replace($readini(matrice.ini,n,$1,l $+ %itr),$chr(160),$chr(32)) $+ ;
      inc %itr
    }
    return $det(%ligne)
  }
}

alias det {
  ;code disponible a cette adresse
  ;http://www.scriptsdb.org/comments.php?id=634
  var %n = $numtok($1,59),%i = 1,%d
  if (%n == 1) { return $1 }
  elseif (%n <= 3) {
    tokenize 59 $1
    tokenize 32 $1-
    if (%n == 2) { return $calc($1 *$4 -$2 *$3) }
    return $calc($1 *$5 *$9 -$3 *$5 *$7 +$4 *$8 *$3 -$6 *$8 *$1 +$7 *$2 *$6 -$9 *$2 *$4)
  }
  while ($gettok($gettok($1,1,59),%i,32) != $null) {
    %d = $calc(%d + $ifmatch * -1^(1 + %i) * $det_r($det_p($1,%i)))
    inc %i
  }
  return %d
}

alias -l det_r return $det($1)
alias -l det_p {
  var %s = $deltok($1,1,59),%i = 1,%z
  while ($gettok(%s,%i,59) != $null) {
    %z = $+(%z,;,$deltok($ifmatch,$2,32))
    inc %i
  }
  return $gettok(%z,1-,59)
}

alias com_mat {
  if ( $dim_mat(l,$1) = $dim_mat(c,$1) ) {
    new_mat $2 numérique $dim_mat(l,$1) $dim_mat(l,$1)
    var %itr = 1
    while ( %itr <= $dim_mat(l,$1) ) {
      var %i = 1
      while ( %i <= $dim_mat(l,$1) ) { min_mat $1 mineur %itr %i | set_mat $2 %itr %i $mat_det(mineur) | del_mat mineur | inc %i }
      inc %itr
    }
  }
}

alias mat_inverse { 
  if ( $dim_mat(l,$1) = $dim_mat(c,$1) ) {
    var %det = $mat_det($1)
    if ( %det != 0 ) {
      com_mat $1 $2
      mat_transpose $2 ~1
      copy_mat $2 ~1
      del_mat ~1
      mat_multi $2 ~1 $calc(1/( %det ))
      copy_mat $2 ~1
      del_mat ~1
    }
    else { echo -a [Erreur] cette matrice n'est pas inversible }
  }
}

alias mat_multi { 
  new_mat $2 numérique $dim_mat(l,$1) $dim_mat(c,$1)
  var %itr = 1
  while ( %itr <= $dim_mat(l,$1) ) {
    var %i = 1
    while ( %i <= $dim_mat(c,$1) ) { set_mat $2 %itr %i $calc($3 * $get_mat($1,%itr,%i)) | inc %i }
    inc %itr
  }
}

alias mat_produit {
  if ( $dim_mat(c,$1) != $dim_mat(l,$2) ) { halt }
  new_mat $3 numérique $dim_mat(l,$1) $dim_mat(c,$2)
  var %i = 1
  while ( %i <= $dim_mat(l,$1) ) {
    var %itr = 1
    while ( %itr <= $dim_mat(c,$2) ) { 
      set_mat $3 %i %itr $element($1,$2,%i,%itr)
      inc %itr
    }
    inc %i
  }
}

alias element { 
  var %tir = 1
  set %élément 0
  while ( %tir <= $dim_mat(c,$1) ) { 
    set %élément $calc(%élément + ( $get_mat($2,$3,%tir) * $get_mat($1,%tir,$4)))
    inc %tir
  }
  return %élément
}

Conclusion :


J'estimais que ces objet manquaient au mirc. Certe ils existaient deja les hastables et les fichiers ini, mais au niveau objet la notion de matrice etait totalement absente du mirc . Voila pourquoi je vous propose cet addon dans la lignée de math.h v2.0 ou je complete le mirc avec des maths.

Certaine etape de traitement ( determinant , comatrice ... ) sont longues a cause du format utilisé ( .ini ) une version future avec des hastable devrait palier a ce defaut. Aussi le séparateur utilise pour les colonnes des matrices est le caractère 160 faite attention a l'utilisation de mon addon si le caractere est dans une chaine que vous voulez traiter.

pour charger l'addon :
deziper le fichier zip dans votre dossier principal et taper
/load -rs matrice.h_v2.0\matrix_editor.txt

noubliez pas de lire l'aide dans le dossier c'est capitale pour eviter de faire des erreurs !!!

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Lucifer666
Messages postés
2
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
30 mai 2005

Franchement c'est trop fort ca, mais bon j'ai aps encore l'utilité des matrices sous mirc, a part faire du dessin, ou de la crypto (on peut coder rsa avec ca en plus, lol) je vois pas trop a quoi sa vas me servir.
Si en tableau de stockage, mais bon sa utilise pas tout la puissance des matrice
cs_Wallach
Messages postés
20
Date d'inscription
samedi 16 avril 2005
Statut
Membre
Dernière intervention
10 janvier 2006

Oh ! coup de coeur !
babass on a eu le meme probleme visiblement pour la calculette. ;p
Excellent code. 10/10 Kerrigan ! ;)
rugbymen
Messages postés
35
Date d'inscription
lundi 31 janvier 2005
Statut
Membre
Dernière intervention
13 février 2005

1/80 =)
cs_KiNdErMaXi
Messages postés
1052
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
30 novembre 2009
2
-.-
tjs rien pané mais bon ^^
bonne continuation
cs_SornDrixer
Messages postés
2087
Date d'inscription
jeudi 12 décembre 2002
Statut
Modérateur
Dernière intervention
30 janvier 2011
2
On compte sur toi Kerrigan :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.