Sous-classes indirectes connues AbstractDenseNdArray <T, U étend NdArray <T>>, AbstractNdArray <T, U étend NdArray <T>>, BooleanDenseNdArray , BooleanNdArray , ByteDenseNdArray , ByteNdArray , DenseNdArray <T>, DoubleDenseNdArray , DoubleNdArray , FloatDenseNdArray , FloatNdArray , tDenseNdArray , IntNdArray , LongDenseNdArray , LongNdArray et 11 autres. |
Une structure de données à N dimensions.
L'interface `NdArray` crée une abstraction entre le stockage physique d'un enregistrement de données, qui peut être linéaire ou segmenté, et sa représentation logique. En général, ils obtiennent de meilleures performances que les tableaux multidimensionnels standards en Java en mappant directement des segments de données linéaires en mémoire.
Comme DataBuffer
, les instances NdArray
prennent en charge l'indexation 64 bits afin de pouvoir être utilisées pour mapper des enregistrements de données très volumineux. Ils prennent également en charge des coordonnées spéciales qui permettent de parcourir leurs valeurs dans n'importe quelle direction ou de sélectionner uniquement un sous-ensemble d'entre elles.
Exemple d'utilisation :
// Creates a 2x3x2 matrix (of rank 3)
FloatNdArray matrix3d = NdArrays.ofFloats(shape(2, 3, 2));
// Initialize sub-matrices data with vectors
matrix.set(NdArrays.vectorOf(1.0f, 2.0f), 0, 0)
.set(NdArrays.vectorOf(3.0f, 4.0f), 0, 1)
.set(NdArrays.vectorOf(5.0f, 6.0f), 0, 2)
.set(NdArrays.vectorOf(7.0f, 8.0f), 1, 0)
.set(NdArrays.vectorOf(9.0f, 10.0f), 1, 1)
.set(NdArrays.vectorOf(11.0f, 12.0f), 1, 2);
// Access the second 3x2 matrix (of rank 2)
FloatNdArray matrix = matrix3d.get(1);
// Access directly the float value at (1, 0) from the second matrix
assertEquals(9.0f, matrix.getFloat(1, 0));
Méthodes publiques
abstrait NdArray <T> | |
abstrait NdArraySequence <? étend NdArray <T>> | éléments (int dimensionIdx) Renvoie une séquence de tous les éléments à une dimension donnée. |
booléen abstrait | est égal à (Obj objet) Vérifie l'égalité entre les tableaux à n dimensions. |
abstrait NdArray <T> | obtenir (longues... coordonnées) Renvoie l'élément à N dimensions de ce tableau aux coordonnées données. |
résumé T | getObject (longues... coordonnées) Renvoie la valeur du scalaire trouvé aux coordonnées données. |
abstrait NdArray <T> | lire ( DataBuffer <T> dst) Lisez le contenu de ce tableau à N dimensions dans le tampon de destination. |
abstrait NdArraySequence <? étend NdArray <T>> | scalaires () Renvoie une séquence de tous les scalaires de ce tableau. |
abstrait NdArray <T> | |
abstrait NdArray <T> | setObject (valeur T, coordonnées longues...) Attribue la valeur du scalaire trouvé aux coordonnées données. |
abstrait NdArray <T> | |
abstrait NdArray <T> | écrire ( DataBuffer <T> src) Écrivez le contenu de ce tableau à N dimensions à partir du tampon source. |
Méthodes héritées
Méthodes publiques
public abstrait NdArray <T> copyTo ( NdArray <T> dst)
Copiez le contenu de ce tableau dans le tableau de destination.
Le shape()
du tableau de destination doit être égal à la forme de ce tableau, sinon une exception est levée. Après la copie, le contenu des deux tableaux peut être modifié indépendamment, sans s'affecter mutuellement.
Paramètres
heure d'été | tableau pour recevoir une copie du contenu de ce tableau |
---|
Retours
- ce tableau
Jetés
IllegalArgumentException | si la forme de dst n'est pas égale à la forme de ce tableau |
---|
public abstrait NdArraySequence <? étend les éléments NdArray <T>> (int dimensionIdx)
Renvoie une séquence de tous les éléments à une dimension donnée.
Logiquement, le tableau à N dimensions peut être aplati en un seul vecteur, où les scalaires du (n - 1)
ème élément précèdent ceux du (n)
ème élément, pour un total de valeurs size()
.
Par exemple, étant donné une matrice nxm
sur les axes [x, y]
, les éléments sont itérés dans l'ordre suivant :
x 0 y 0 , x 0 y 1 , ..., x 0 y m-1 , x 1 y 0 , x 1 y 1 , ..., x n-1 y m-1
La séquence renvoyée peut ensuite être itérée pour visiter chaque élément, soit en appelant forEach(Consumer)
ou forEachIndexed(BiConsumer)
.
// Iterate matrix for initializing each of its vectors
matrixOfFloats.elements(0).forEach(v -> {
v.set(vector(1.0f, 2.0f, 3.0f));
);
// Iterate a vector for reading each of its scalar
vectorOfFloats.scalars().forEachIdx((coords, s) -> {
System.out.println("Value " + s.getFloat() + " found at " + coords);
});
}
Paramètres
dimensionIdx | indice de la dimension |
---|
Retours
- une séquence
NdArray
Jetés
IllegalArgumentException | si dimensionIdx est supérieur ou égal au nombre total de dimensions de ce tableau |
---|
public abstrait booléen égal (Objet obj)
Vérifie l'égalité entre les tableaux à n dimensions.
Un tableau est égal à un autre objet si cet objet est un autre NdArray
de même forme, type et que les éléments sont égaux et dans le même ordre. Par exemple:
IntNdArray array = NdArrays.ofInts(Shape.of(2, 2))
.set(NdArrays.vectorOf(1, 2), 0)
.set(NdArrays.vectorOf(3, 4), 1);
assertEquals(array, StdArrays.ndCopyOf(new int[][] { {1, 2
, {3, 4} })); // true
assertEquals(array, StdArrays.ndCopyOf(new Integer[][] { {1, 2}, {3, 4} })); // true, as Integers are equal to ints
assertNotEquals(array, NdArrays.vectorOf(1, 2, 3, 4)); // false, different shapes
assertNotEquals(array, StdArrays.ndCopyOf(new int[][] { {3, 4}, {1, 2} })); // false, different order
assertNotEquals(array, StdArrays.ndCopyOf(new long[][] { {1L, 2L}, {3L, 4L} })); // false, different types
}
Notez que le calcul nécessaire pour vérifier l'égalité entre deux tableaux peut être coûteux dans certains cas et par conséquent, il est recommandé de ne pas utiliser cette méthode dans un chemin critique où les performances comptent.
Paramètres
obj | objet avec lequel comparer ce tableau |
---|
Retours
- vrai si ce tableau est égal à l'objet fourni
public abstract NdArray <T> get (coordonnées longues...)
Renvoie l'élément à N dimensions de ce tableau aux coordonnées données.
Des éléments de n’importe quelle dimension de ce tableau peuvent être récupérés. Par exemple, si le nombre de coordonnées est égal au nombre de dimensions de ce tableau, alors un tableau de rang 0 (scalaire) est renvoyé, dont la valeur peut ensuite être obtenue en appelant « array.getObject() ».
Toute modification appliquée aux éléments renvoyés affecte également les données de ce tableau, car aucune copie n'est impliquée.
Notez que l'invocation de cette méthode est un moyen équivalent et plus efficace de découper ce tableau sur un seul scalaire, c'est-à-dire que array.get(x, y, z)
est égal à array.slice(at(x), at(y), at(z))
Paramètres
coordonnées | coordonnées de l'élément auquel accéder, aucun ne renverra ce tableau |
---|
Retours
- l'élément à cet index
Jetés
IndexOutOfBoundsException | si certaines coordonnées sont hors des limites de leur dimension respective |
---|
public abstract T getObject (coordonnées longues...)
Renvoie la valeur du scalaire trouvé aux coordonnées données.
Pour accéder à l'élément scalaire, le nombre de coordonnées fournies doit être égal au nombre de dimensions de ce tableau (c'est à dire son rang). Par exemple:
FloatNdArray matrix = NdArrays.ofFloats(shape(2, 2)); // matrix rank = 2
matrix.getObject(0, 1); // succeeds, returns 0.0f
matrix.getObject(0); // throws IllegalRankException
FloatNdArray scalar = matrix.get(0, 1); // scalar rank = 0
scalar.getObject(); // succeeds, returns 0.0f
floatArray.getFloat(0);
. Paramètres
coordonnées | coordonnées du scalaire à résoudre |
---|
Retours
- valeur de ce scalaire
Jetés
IndexOutOfBoundsException | si certaines coordonnées sont hors des limites de leur dimension respective |
---|---|
IllégalRankException | si le nombre de coordonnées n'est pas suffisant pour accéder à un élément scalaire |
public abstrait NdArray <T> lecture ( DataBuffer <T> dst)
Lisez le contenu de ce tableau à N dimensions dans le tampon de destination.
La taille du tampon doit être égale ou supérieure à la size()
de ce tableau, sinon une exception est levée. Après la copie, le contenu du buffer et du tableau peut être modifié indépendamment, sans s'affecter mutuellement.
Paramètres
heure d'été | le tampon de destination |
---|
Retours
- ce tableau
Jetés
BufferOverflowException | si le tampon ne peut pas contenir le contenu de ce tableau |
---|
Voir aussi
public abstrait NdArraySequence <? étend les scalaires NdArray <T>> ()
Renvoie une séquence de tous les scalaires de ce tableau.
Cela équivaut à appeler elements(shape().numDimensions() - 1)
Retours
- une séquence
NdArray
public abstract NdArray <T> set ( NdArray <T> src, coordonnées longues...)
Attribue la valeur de l'élément à N dimensions trouvé aux coordonnées données.
Le nombre de coordonnées fournies peut être compris entre 0 et le rang - 1. Par exemple :
FloatNdArray matrix = NdArrays.ofFloats(shape(2, 2)); // matrix rank = 2
matrix.set(vector(10.0f, 20.0f), 0); // success
matrix.set(scalar(10.0f), 1, 0); // success
Paramètres
src | un tableau des valeurs à attribuer |
---|---|
coordonnées | coordonnées de l'élément à affecter |
Retours
- ce tableau
Jetés
IndexOutOfBoundsException | si certaines coordonnées sont hors des limites de leur dimension respective |
---|
public abstract NdArray <T> setObject (valeur T, coordonnées longues...)
Attribue la valeur du scalaire trouvé aux coordonnées données.
Pour accéder à l'élément scalaire, le nombre de coordonnées fournies doit être égal au nombre de dimensions de ce tableau (c'est à dire son rang). Par exemple:
FloatNdArray matrix = NdArrays.ofFloats(shape(2, 2)); // matrix rank = 2
matrix.setObject(10.0f, 0, 1); // succeeds
matrix.setObject(10.0f, 0); // throws IllegalRankException
FloatNdArray scalar = matrix.get(0, 1); // scalar rank = 0
scalar.setObject(10.0f); // succeeds
floatArray.setFloat(10.0f, 0);
Paramètres
valeur | la valeur à attribuer |
---|---|
coordonnées | coordonnées du scalaire à attribuer |
Retours
- ce tableau
Jetés
IndexOutOfBoundsException | si certaines coordonnées sont hors des limites de leur dimension respective |
---|---|
IllégalRankException | si le nombre de coordonnées n'est pas suffisant pour accéder à un élément scalaire |
tranche publique abstraite NdArray <T> ( Index... indices)
Crée une vue (ou tranche) multidimensionnelle de ce tableau en mappant une ou plusieurs dimensions aux sélecteurs d'index donnés.
Les tranches permettent de parcourir un tableau à N dimensions dans n'importe lequel de ses axes et/ou de filtrer uniquement les éléments d'intérêt. Par exemple, pour une matrice donnée sur les axes [x, y]
, il est possible d'itérer les éléments à y=0
pour tous x
.
Toute modification appliquée à la tranche renvoyée affecte également les données de ce tableau, car aucune copie n'est impliquée.
Exemple d'utilisation :
FloatNdArray matrix3d = NdArrays.ofFloats(shape(3, 2, 4)); // with [x, y, z] axes
// Iterates elements on the x axis by preserving only the 3rd value on the z axis,
// (i.e. [x, y, 2])
matrix3d.slice(all(), all(), at(2)).elements(0).forEach(m -> {
assertEquals(shape(2), m); // y=2, z=0 (scalar)
);
// Creates a slice that contains only the last element of the y axis and elements with an
// odd `z` coordinate.
FloatNdArray slice = matrix3d.slice(all(), at(1), odd());
assertEquals(shape(3, 2), slice.shape()); // x=3, y=0 (scalar), z=2 (odd coordinates)
// Iterates backward the elements on the x axis
matrix3d.slice(flip()).elements(0).forEach(m -> {
assertEquals(shape(2, 4), m); // y=2, z=4
});
}
Paramètres
indices | sélecteurs d'index par dimensions, à partir de la dimension 0 de ce tableau. |
---|
Retours
- l'élément résultant de la sélection de l'index
Jetés
IndexOutOfBoundsException | si certaines coordonnées sont hors des limites de leur dimension respective |
---|
public abstrait NdArray <T> écriture ( DataBuffer <T> src)
Écrivez le contenu de ce tableau à N dimensions à partir du tampon source.
La taille du tampon doit être égale ou supérieure à la size()
de ce tableau, sinon une exception est levée. Après la copie, le contenu du buffer et du tableau peut être modifié indépendamment, sans s'affecter mutuellement.
Paramètres
src | le tampon source |
---|
Retours
- ce tableau
Jetés
BufferUnderflowException | si le tampon n'a pas suffisamment de données restantes pour écrire dans ce tableau |
---|