Matrice.h v2.0

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

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.