AccueilActualités informatiqueLe langage de programmation Kotlin se dote d'une bibliothèque pour les tableaux...

Le langage de programmation Kotlin se dote d’une bibliothèque pour les tableaux multidimensionnels

JetBrains a publié la version 0.1 de la bibliothèque Multik pour le langage de programmation Kotlin. La bibliothèque met en correspondance les tableaux multidimensionnels et connaît, entre autres, les matrices et les tableaux comportant jusqu’à quatre dimensions. Il peut effectuer des opérations mathématiques sur des éléments individuels ainsi que sur les tableaux.

La version 0.1, qui vient d’être publiée, ajoute des fonctions et des constructions étendues telles que les nombres complexes et la factorisation LU à la bibliothèque annoncée pour la première fois en février. Il apporte également des méthodes pour écrire et lire le contenu des fichiers CSV.

Sommaire

Selon un billet de blog datant de février, JetBrains avait initialement prévu de baser la bibliothèque sur NumPy ou sur des approches similaires. Cependant, les frais généraux associés à ce système étaient probablement trop importants, c’est pourquoi Multik a été créée en tant que bibliothèque autonome. Les structures de données sont mises en œuvre séparément des opérations et doivent être insérées dans les projets en tant que dépendances individuelles.

Actuellement, Multik propose trois moteurs différents : multik-jvm est une mise en œuvre des opérations mathématiques sur la machine virtuelle Java avec Kotlin/JVM, multik-native est une implémentation C++ qui s’appuie sur la bibliothèque OpenBLAS pour l’algèbre linéaire, et multik-default est une combinaison des implémentations natives et JVM. Cette dernière est, comme son nom l’indique, l’implémentation par défaut.

Les constructions les plus simples sont la création d’un vecteur ou d’une matrice sous forme de tableau bidimensionnel à partir d’une collection, comme dans l’exemple de code suivant tiré de l’article de blog présentant la bibliothèque :

val myList = listOf(1, 2, 3)
val a = mk.ndarray(myList)
/* [1, 2, 3] */

val m = mk.ndarray(mk[myList, myList])
/*
[[1, 2, 3],
[1, 2, 3]]
*/

En outre, il y a, entre autres, les éléments suivants mk.identity pour une unité ou une matrice d’identité qui a des uns sur le grand axe et des zéros dans la zone restante, et mk.empty pour un tableau multidimensionnel de zéros.

Les tableaux multidimensionnels peuvent être additionnés, soustraits, multipliés et divisés entre eux :

val a = mk.ndarray(mk[mk[1.0,2.0], mk[3.0,4.0]])
val b = mk.identity<Double>(2)

a + b
/*
[[2.0, 2.0],
[3.0, 5.0]]
*/

b / a
/*
[[1.0, 0.0],
[0.0, 0.25]]
*/

De plus, la bibliothèque permet l’utilisation directe de fonctions mathématiques sur les éléments respectifs, telles que mk.math.sin(a). Des fonctions d’agrégation permettant de déterminer la moyenne, la somme ou le maximum peuvent également être utilisées. Le contenu peut être filtré, regroupé et trié. Enfin, il existe des fonctions pour indexer et découper les tableaux.

La version 0.1 introduit des constructions et des opérations supplémentaires, notamment la décomposition d’une matrice en une matrice triangulaire inférieure et supérieure via la factorisation LU :

Décomposition d’une matrice en une matrice de permutation et une matrice triangulaire supérieure et inférieure.

(Image : JetBrains)

La méthode supplémentaire nouvellement introduite solve est utilisé pour résoudre des systèmes d’équations linéaires, comme le montre l’exemple suivant tiré de l’article de blog sur la sortie de la dernière version :

val a = mk.ndarray(mk[mk[2, 5, 1], mk[7, 3, 1], mk[8, 9, 4]])
val b = mk.ndarray(mk[3, 1, 2])
mk.linalg.solve(a, b)
// [-0.036363636363636265, 0.9090909090909091, -1.4727272727272729]

D’autres ajouts sont la factorisation QR et la matrice inverse. En outre, il existe maintenant des fonctions permettant de fusionner ou de combiner des tableaux via append et stack.

En outre, la bibliothèque peut désormais représenter des nombres complexes, qui peuvent être utilisés en tant que re + i * im sont décrites, où concernant décrit la partie réelle et i * dans le la partie où i est l’unité imaginaire dont le nombre carré donne -1 ( = -1) :

val cf = ComplexFloat(1f, 2f) // 1.0+(2.0)i
val cd = ComplexDouble.one // 1.0+(0.0)i

Les deux nouvelles classes pour les nombres complexes, respectivement en tant que conversions float et double, peuvent probablement être utilisées comme la classe Number-afin que les opérateurs mathématiques puissent être utilisés directement.

Vous trouverez plus de détails sur la bibliothèque et les innovations de la version 0.1 sur le blog Kotlin de JetBrains.

Plus d'articles