Opcodes d'algèbre linéaire — Arithmétique scalaire, vectorielle et matricielle sur des valeurs réelles et complexes.
Opcodes du greffon linear_algebra. Ce greffon fait partie de l'entrepôt des greffons et il doit être installé séparément. L'entrepôt des greffons est ici : https://github.com/csound/plugins
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 getfem.org/gmm/index.html.
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 :
Pour plus de détails, voir la documentation de gmm++ à http://download.gna.org/getfem/doc/gmmuser.pdf.
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.
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.
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
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]
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
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
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
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
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
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
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