Opcodes d'algèbre linéaire
Précédent | Opérations mathématiques | Suivant

## Opcodes d'algèbre linéaire

Opcodes d'algèbre linéaire — Arithmétique scalaire, vectorielle et matricielle sur des valeurs réelles et complexes.

## Description

Ces opcodes implémentent plusieurs opérations d'algèbre linéaire, depuis l'arithmétique scalaire, vectorielle et matricielle jusqu'aux décompositions en valeurs propres basées sur la décomposition QR. Les opcodes sont conçus pour le traitement numérique du signal, et bien sûr pour d'autres opérations mathématiques, dans le langage d'orchestre de Csound.

L'implémentation numérique utilise la bibliothèque gmm++ de home.gna.org/getfem/gmm_intro.

| Avertissement
Pour les applications avec des variables f-sig, l'arithmétique sur les tableaux ne peut être exécutée que si le f-sig est "actuel", car le taux-f est une fraction du taux-k ; ce caractère actuel peut être déterminé avec l'opcode la_k_current_f. Pour les applications que utilisent des affectations entre vecteurs réels et variables de taux-a, l'arithmétique sur les tableaux ne peut être exécutée que si les vecteurs sont "actuels", car la taille du vecteur peut être un multiple entier de ksmps ; ce caractère actuel peut être déterminé au moyen de l'opcode la_k_current_vr.

Tableau 4. Types de données de l'algèbre linéaire

Type mathématique | Code | Type(s) de Csound correspondant(s)
--- | --- | ---
scalaire réel | r | variable de taux-i ou de taux-k
scalaire complexe | c | paire de variables de taux-i ou de taux-k, par exemple "kr, ki"
vecteur réel | vr | variable de taux-i contenant l'adresse d'un tableau
vecteur réel | a | variable de taux-a
vecteur réel | t | numéro d'une table de fonction
vecteur complexe | vc | variable de taux-i contenant l'adresse d'un tableau
vecteur complexe | f | variable fsig
matrice réelle | mr | variable de taux-i contenant l'adresse d'un tableau
matrice complexe | mc | variable de taux-i contenant l'adresse d'un tableau

Tous les tableaux sont indexés à partir de 0 ; le premier indice parcourt les lignes pour donner les colonnes, le deuxième indice parcourt les colonnes pour donner les éléments.

Tous les tableaux sont généraux et denses ; les routines pour les matrices bande, hermitiennes, symétriques et creuses ne sont pas implémentées.

Un tableau peut avoir pour code de type vr, vc, mr ou mc et il est stocké dans un objet de taux-i. Dans le code de l'orchestre, un tableau est passé comme une variable MYFLT de taux-i qui contient l'adresse de l'objet tableau, celui-ci étant stocké dans l'espace d'allocation de l'instance de l'opcode. Bien que les variables tableau soient de taux-i, leurs valeurs et même leur forme peuvent être modifées au taux-i ou au taux-k.

Tous les opérandes doivent être pré-alloués ; à l'exception des opcodes de création, aucun opcode n'alloue de tableau. Ceci reste vérifié même si le tableau apparaît à gauche d'un opcode ! Cependant, certaines opérations peuvent reformater les tableaux pour y faire entrer leurs résultats.

Les tableaux sont libérés automatiquement lorsque leur instrument est libéré.

Afin d'améliorer l'exécution et aussi de rendre plus aisée la mémorisation des noms des opcodes, le taux d'exécution, les types de valeur en sortie, les noms des opérations et les types de valeur en entrée sont encodés explicitement dans le nom de l'opcode :

1. "la" pour "famille d'opcode d'algèbre linéaire".
2. "i" ou "k" pour le taux d'exécution.
3. Code(s) de type (voir ci-dessus) pour la ou les valeurs de sortie, seulement si le type n'est pas déduit implicitement des valeurs en entrée.
4. Nom d'opération : nom mathématique usuel (de préférence) ou abréviation.
5. Code(s) de type pour les valeurs en entrée, s'ils ne sont pas implicites.

Pour plus de détails, voir la documentation de gmm++ à http://download.gna.org/getfem/doc/gmmuser.pdf.

## Syntaxe

#### Création de tableau

    ivr                         la_i_vr_create        irows

Crée un vecteur réel de irows lignes.

    ivc                         la_i_vc_create        irows

Crée un vecteur complexe de irows lignes.

    imr                         la_i_mr_create        irows, icolumns  [, odiagonal]

Crée une matrice réelle de irows lignes et icolumns colonnes, avec une valeur facultative sur sa diagonale.

    imc                         la_i_mc_create        irows, icolumns  [, odiagonal_r, odiagonal_i]

Crée une matrice complexe de irows lignes et icolumns colonnes, avec une valeur facultative sur sa diagonale.

#### Examen de tableau

    irows                       la_i_size_vr          ivr

Retourne le nombre de lignes du vecteur réel ivr.

    irows                       la_i_size_vc          ivc

Retourne le nombre de lignes du vecteur complexe ivc.

    irows, icolumns             la_i_size_mr          imr

Retourne le nombre de lignes et de colonnes de la matrice réelle imr.

    irows, icolumns             la_i_size_mc          imc

Retourne le nombre de lignes et de colonnes de la matrice complexe imc.

    kfiscurrent                 la_k_current_f        fsig

Retourne 1 si le fsig est actuel, c'est-à-dire si la valeur du fsig changera lors de la prochaine période-k.

    kvriscurrent                la_k_current_vr       ivr

Retourne 1 si le vecteur réel est actuel, c'est-à-dire, si la trame d'échantillon actuelle de Csound se trouve à l'indice 0 du vecteur.

                                la_i_print_vr         ivr

Affiche la valeur du vecteur réel ivr.

                                la_i_print_vc         ivc

Affiche la valeur du vecteur complexe ivc.

                                la_i_print_mr         imr

Affiche la valeur de la matrice réelle imr.

                                la_i_print_mc         imc

Affiche la valeur de la matrice complexe imc.

#### Affectation et conversion de tableau

    ivr                         la_i_assign_vr        ivr

Affecte la valeur du vecteur réel à droite au vecteur réel à gauche, au taux-i.

    ivr                         la_k_assign_vr        ivr

Affecte la valeur du vecteur réel à droite au vecteur réel à gauche, au taux-k.

    ivc                         la_i_assign_vc        ivc

    ivc                         la_k_assign_vc        ivr

    imr                         la_i_assign_mr        imr

    imr                         la_k_assign_mr        imr

    imc                         la_i_assign_mc        imc

    imc                         la_k_assign_mc        imr

| Avertissement
Les affectations vers des vecteurs à partir de tables ou de fsigs peuvent reformater les vecteurs. Les affectations vers des vecteurs à partir de variables de taux-a, ou vers des variables de taux-a à partir de vecteurs, seront exécutées de manière incrémentielle, un bloc de ksmps éléments par période-k. C'est pourquoi l'arithmétique vectorielle sur ces vecteurs ne peut être pratiquées que si ceux-ci sont actuels, selon la détermination par l'opcode la_k_currrent_vr.

    ivr                         la_k_assign_a         asig

    ivr                         la_i_assign_t         itablenumber

    ivr                         la_k_assign_t         itablenumber

    ivc                         la_k_assign_f         fsig

    asig                        la_k_a_assign         ivr

    itablenum                   la_i_t_assign         ivr

    itablenum                   la_k_t_assign         ivr

    fsig                        la_k_f_assign         ivc

#### Remplissage des Tableaux par des Eléments Aléatoires

    ivr                         la_i_random_vr        [ifill_fraction]

    ivr                         la_k_random_vr        [kfill_fraction]

    ivc                         la_i_random_vc        [ifill_fraction]

    ivc                         la_k_random_vc        [kfill_fraction]

    imr                         la_i_random_mr        [ifill_fraction]

    imr                         la_k_random_mr        [kfill_fraction]

    imc                         la_i_random_mc        [ifill_fraction]

    imc                         la_k_random_mc        [kfill_fraction]

#### Accès aux éléments d'un tableau

    ivr                         la_i_vr_set           irow, ivalue

    kvr                         la_k_vr_set           krow, kvalue

    ivc                         la_i_vc_set           irow, ivalue_r, ivalue_i

    kvc                         la_k_vc_set           krow, kvalue_r, kvalue_i

    imr                         la_i mr_set           irow, icolumn, ivalue

    kmr                         la_k mr_set           krow, kcolumn, ivalue

    imc                         la_i_mc_set           irow, icolumn, ivalue_r, ivalue_i

    kmc                         la_k_mc_set           krow, kcolumn, kvalue_r, kvalue_i

    ivalue                      la_i_get_vr           ivr, irow

    kvalue                      la_k_get_vr           ivr, krow

    ivalue_r, ivalue_i          la_i_get_vc           ivc, irow

    kvalue_r, kvalue_i          la_k_get_vc           ivc, krow

    ivalue                      la_i_get_mr           imr, irow, icolumn

    kvalue                      la_k_get_mr           imr, krow, kcolumn

    ivalue_r, ivalue_i          la_i_get_mc           imc, irow, icolumn

    kvalue_r, kvalue_i          la_k_get_mc           imc, krow, kcolumn

#### Opérations sur un tableau

    imr                         la_i_transpose_mr     imr

    imr                         la_k_transpose_mr     imr

    imc                         la_i_transpose_mc     imc

    imc                         la_k_transpose_mc     imc

    ivr                         la_i_conjugate_vr     ivr

    ivr                         la_k_conjugate_vr     ivr

    ivc                         la_i_conjugate_vc     ivc

    ivc                         la_k_conjugate_vc     ivc

    imr                         la_i_conjugate_mr     imr

    imr                         la_k_conjugate_mr     imr

    imc                         la_i_conjugate_mc     imc

    imc                         la_k_conjugate_mc     imc

#### Opérations scalaires

    ir                          la_i_norm1_vr         ivr

    kr                          la_k_norm1_vr         ivc

    ir                          la_i_norm1_vc         ivc

    kr                          la_k_norm1_vc         ivc

    ir                          la_i_norm1_mr         imr

    kr                          la_k_norm1_mr         imr

    ir                          la_i_norm1_mc         imc

    kr                          la_k_norm1_mc         imc

    ir                          la_i_norm_euclid_vr   ivr

    kr                          la_k_norm_euclid_vr   ivr

    ir                          la_i_norm_euclid_vc   ivc

    kr                          la_k_norm_euclid_vc   ivc

    ir                          la_i_norm_euclid_mr   mvr

    kr                          la_k_norm_euclid_mr   mvr

    ir                          la_i_norm_euclid_mc   mvc

    kr                          la_k_norm_euclid_mc   mvc

    ir                          la_i_distance_vr      ivr

    kr                          la_k_distance_vr      ivr

    ir                          la_i_distance_vc      ivc

    kr                          la_k_distance_vc      ivc

    ir                          la_i_norm_max         imr

    kr                          la_k_norm_max         imc

    ir                          la_i_norm_max         imr

    kr                          la_k_norm_max         imc

    ir                          la_i_norm_inf_vr      ivr

    kr                          la_k_norm_inf_vr      ivr

    ir                          la_i_norm_inf_vc      ivc

    kr                          la_k_norm_inf_vc      ivc

    ir                          la_i_norm_inf_mr      imr

    kr                          la_k_norm_inf_mr      imr

    ir                          la_i_norm_inf_mc      imc

    kr                          la_k_norm_inf_mc      imc

    ir                          la_i_trace_mr         imr

    kr                          la_k_trace_mr         imr

    ir, ii                      la_i_trace_mc         imc

    kr, ki                      la_k_trace_mc         imc

    ir                          la_i_lu_det           imr

    kr                          la_k_lu_det           imr

    ir                          la_i_lu_det           imc

    kr                          la_k_lu_det           imc

#### Opérations sur les éléments entre tableaux

    ivr                         la_i_add_vr           ivr_a, ivr_b

    ivc                         la_k_add_vc           ivc_a, ivc_b

    imr                         la_i_add_mr           imr_a, imr_b

    imc                         la_k_add_mc           imc_a, imc_b

    ivr                         la_i_subtract_vr      ivr_a, ivr_b

    ivc                         la_k_subtract_vc      ivc_a, ivc_b

    imr                         la_i_subtract_mr      imr_a, imr_b

    imc                         la_k_subtract_mc      imc_a, imc_b

    ivr                         la_i_multiply_vr      ivr_a, ivr_b

    ivc                         la_k_multiply_vc      ivc_a, ivc_b

    imr                         la_i_multiply_mr      imr_a, imr_b

    imc                         la_k_multiply_mc      imc_a, imc_b

    ivr                         la_i_divide_vr        ivr_a, ivr_b

    ivc                         la_k_divide_vc        ivc_a, ivc_b

    imr                         la_i_divide_mr        imr_a, imr_b

    imc                         la_k_divide_mc        imc_a, imc_b

#### Produits scalaires

    ir                          la_i_dot_vr           ivr_a, ivr_b

    kr                          la_k_dot_vr           ivr_a, ivr_b

    ir, ii                      la_i_dot_vc           ivc_a, ivc_b

    kr, ki                      la_k_dot_vc           ivc_a, ivc_b

    imr                         la_i_dot_mr           imr_a, imr_b

    imr                         la_k_dot_mr           imr_a, imr_b

    imc                         la_i_dot_mc           imc_a, imc_b

    imc                         la_k_dot_mc           imc_a, imc_b

    ivr                         la_i_dot_mr_vr        imr_a, ivr_b

    ivr                         la_k_dot_mr_vr        imr_a, ivr_b

    ivc                         la_i_dot_mc_vc        imc_a, ivc_b

    ivc                         la_k_dot_mc_vc        imc_a, ivc_b

#### Inversion de matrice

    imr, icondition             la_i_invert_mr        imr

    imr, kcondition             la_k_invert_mr        imr

    imc, icondition             la_i_invert_mc        imc

    imc, kcondition             la_k_invert_mc        imc

#### Décompositions et résolutions de matrice

    ivr                         la_i_upper_solve_mr   imr [, j_1_diagonal]

    ivr                         la_k_upper_solve_mr   imr [, j_1_diagonal]

    ivc                         la_i_upper_solve_mc   imc [, j_1_diagonal]

    ivc                         la_k_upper_solve_mc   imc [, j_1_diagonal]

    ivr                         la_i_lower_solve_mr   imr [, j_1_diagonal]

    ivr                         la_k_lower_solve_mr   imr [, j_1_diagonal]

    ivc                         la_i_lower_solve_mc   imc [, j_1_diagonal]

    ivc                         la_k_lower_solve_mc   imc [, j_1_diagonal]

    imr, ivr_pivot, isize       la_i_lu_factor_mr     imr

    imr, ivr_pivot, ksize       la_k_lu_factor_mr     imr

    imc, ivr_pivot, isize       la_i_lu_factor_mc     imc

    imc, ivr_pivot, ksize       la_k_lu_factor_mc     imc

    ivr_x                       la_i_lu_solve_mr      imr, ivr_b

    ivr_x                       la_k_lu_solve_mr      imr, ivr_b

    ivc_x                       la_i_lu_solve_mc      imc, ivc_b

    ivc_x                       la_k_lu_solve_mc      imc, ivc_b

    imr_q, imr_r                la_i_qr_factor_mr     imr

    imr_q, imr_r                la_k_qr_factor_mr     imr

    imc_q, imc_r                la_i_qr_factor_mc     imc

    imc_q, imc_r                la_k_qr_factor_mc     imc

    ivr_eig_vals                la_i_qr_eigen_mr      imr, i_tolerance

    ivr_eig_vals                la_k_qr_eigen_mr      imr, k_tolerance

    ivr_eig_vals                la_i_qr_eigen_mc      imc, i_tolerance

    ivr_eig_vals                la_k_qr_eigen_mc      imc, k_tolerance

| Avertissement
Une matrice doit être hermitienne si l'on veut calculer ses valeurs propres.

    ivr_eig_vals, imr_eig_vecs  la_i_qr_sym_eigen_mr  imr, i_tolerance

    ivr_eig_vals, imr_eig_vecs  la_k_qr_sym_eigen_mr  imr, k_tolerance

    ivc_eig_vals, imc_eig_vecs  la_i_qr_sym_eigen_mc  imc, i_tolerance

    ivc_eig_vals, imc_eig_vecs  la_k_qr_sym_eigen_mc  imc, k_tolerance

## Crédits

Michael Gogins

Nouveau dans la version 5.09 de Csound

Précédent | Niveau supérieur | Suivant
Fonctions trigonométriques | Sommaire | Opcodes de tableaux