Subclasses indiretas conhecidas AbstractDenseNdArray <T, U estende NdArray <T>>, AbstractNdArray <T, U estende NdArray <T>>, BooleanDenseNdArray , BooleanNdArray , ByteDenseNdArray , ByteNdArray , DenseNdArray <T>, DoubleDenseNdArray , DoubleNdArray , FloatDenseNdArray , FloatNdArray , IntDenseNdArray , IntNdArray , LongDenseNdArray , LongNdArray e outros 11. |
Uma estrutura de dados de N dimensões.
A interface `NdArray` cria uma abstração entre o armazenamento físico de um registro de dados, que pode ser linear ou segmentado, e sua representação lógica. Em geral, eles alcançam melhores desempenhos do que arrays multidimensionais padrão em Java, mapeando segmentos de dados lineares diretamente na memória.
Assim como DataBuffer
, as instâncias NdArray
suportam indexação de 64 bits para que possam ser usadas para mapear registros de dados muito grandes. Eles também suportam coordenadas especiais que permitem percorrer seus valores em qualquer direção ou selecionar apenas um subconjunto deles.
Exemplo de uso:
// 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étodos Públicos
abstrato NdArray <T> | |
abstrato NdArraySequence <? estende NdArray <T>> | elementos (int dimensãoIdx) Retorna uma sequência de todos os elementos em uma determinada dimensão. |
booleano abstrato | é igual (objeto obj) Verifica a igualdade entre matrizes n-dimensionais. |
abstrato NdArray <T> | obter (longas... coordenadas) Retorna o elemento N-dimensional desta matriz nas coordenadas fornecidas. |
abstrato T | getObject (longo... coordenadas) Retorna o valor do escalar encontrado nas coordenadas fornecidas. |
abstrato NdArray <T> | |
abstrato NdArraySequence <? estende NdArray <T>> | escalares () Retorna uma sequência de todos os escalares nesta matriz. |
abstrato NdArray <T> | |
abstrato NdArray <T> | setObject (valor T, coordenadas longas) Atribui o valor do escalar encontrado nas coordenadas fornecidas. |
abstrato NdArray <T> | |
abstrato NdArray <T> |
Métodos herdados
Métodos Públicos
público abstrato NdArray <T> copyTo ( NdArray <T> dst)
Copie o conteúdo deste array para o array de destino.
O shape()
do array de destino deve ser igual ao formato deste array, ou uma exceção será lançada. Após a cópia, o conteúdo de ambos os arrays pode ser alterado de forma independente, sem afetar um ao outro.
Parâmetros
horário de verão | array para receber uma cópia do conteúdo deste array |
---|
Devoluções
- esta matriz
Lança
IllegalArgumentException | se a forma de dst não for igual à forma desta matriz |
---|
público abstrato NdArraySequence <? estende elementos NdArray <T>> (int dimensionIdx)
Retorna uma sequência de todos os elementos em uma determinada dimensão.
Logicamente, a matriz N-dimensional pode ser nivelada em um único vetor, onde os escalares do (n - 1)
-ésimo elemento precedem aqueles do (n)
-ésimo elemento, para um total de valores size()
.
Por exemplo, dada uma matriz nxm
nos eixos [x, y]
, os elementos são iterados na seguinte ordem:
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
A sequência retornada pode então ser iterada para visitar cada elemento, chamando 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);
});
}
Parâmetros
dimensãoIdx | índice da dimensão |
---|
Devoluções
- uma sequência
NdArray
Lança
IllegalArgumentException | se dimensionIdx for maior ou igual ao número total de dimensões desta matriz |
---|
público abstrato booleano igual a (Object obj)
Verifica a igualdade entre matrizes n-dimensionais.
Um array é igual a outro objeto se este objeto for outro NdArray
do mesmo formato, tipo e os elementos forem iguais e na mesma ordem. Por exemplo:
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
}
Observe que o cálculo necessário para verificar a igualdade entre duas matrizes pode ser caro em alguns casos e, portanto, é recomendado não usar este método em um caminho crítico onde o desempenho é importante.
Parâmetros
obj | objeto para comparar esta matriz com |
---|
Devoluções
- verdadeiro se esta matriz for igual ao objeto fornecido
public abstract NdArray <T> get (coordenadas longas...)
Retorna o elemento N-dimensional desta matriz nas coordenadas fornecidas.
Elementos de qualquer uma das dimensões desta matriz podem ser recuperados. Por exemplo, se o número de coordenadas for igual ao número de dimensões deste array, então um array de classificação 0 (escalar) é retornado, cujo valor pode então ser obtido chamando `array.getObject()`.
Quaisquer alterações aplicadas aos elementos retornados também afetam os dados deste array, pois não há cópia envolvida.
Observe que invocar esse método é uma maneira equivalente e mais eficiente de dividir esse array em um único escalar, ou seja, array.get(x, y, z)
é igual a array.slice(at(x), at(y), at(z))
Parâmetros
coordenadas | coordenadas do elemento a ser acessado, nenhuma retornará este array |
---|
Devoluções
- o elemento neste índice
Lança
IndexOutOfBoundsException | se algumas coordenadas estiverem fora dos limites de sua respectiva dimensão |
---|
público abstrato T getObject (longo... coordenadas)
Retorna o valor do escalar encontrado nas coordenadas fornecidas.
Para acessar o elemento escalar, o número de coordenadas fornecidas deve ser igual ao número de dimensões deste array (ou seja, sua classificação). Por exemplo:
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
Nota: se este array armazena valores de um tipo primitivo, prefira a utilização do método especializado na subclasse para esse tipo. Por exemplo, floatArray.getFloat(0);
. Parâmetros
coordenadas | coordenadas do escalar para resolver |
---|
Devoluções
- valor desse escalar
Lança
IndexOutOfBoundsException | se algumas coordenadas estiverem fora dos limites de sua respectiva dimensão |
---|---|
IlegalRankException | se o número de coordenadas não for suficiente para acessar um elemento escalar |
público abstrato NdArray <T> lido ( DataBuffer <T> dst)
Leia o conteúdo desta matriz N-dimensional no buffer de destino.
O tamanho do buffer deve ser igual ou maior ao size()
deste array, ou uma exceção será lançada. Após a cópia, o conteúdo do buffer e do array podem ser alterados de forma independente, sem afetar um ao outro.
Parâmetros
horário de verão | o buffer de destino |
---|
Devoluções
- esta matriz
Lança
BufferOverflowException | se o buffer não puder conter o conteúdo desta matriz |
---|
Veja também
público abstrato NdArraySequence <? estende NdArray <T>> escalares ()
Retorna uma sequência de todos os escalares nesta matriz.
Isso é equivalente a chamar elements(shape().numDimensions() - 1)
Devoluções
- uma sequência
NdArray
public abstract NdArray <T> set ( NdArray <T> src, long... coordenadas)
Atribui o valor do elemento N-dimensional encontrado nas coordenadas fornecidas.
O número de coordenadas fornecidas pode estar em qualquer lugar entre 0 e classificação - 1. Por exemplo:
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
Parâmetros
fonte | uma matriz de valores a serem atribuídos |
---|---|
coordenadas | coordenadas do elemento a atribuir |
Devoluções
- esta matriz
Lança
IndexOutOfBoundsException | se algumas coordenadas estiverem fora dos limites de sua respectiva dimensão |
---|
public abstract NdArray <T> setObject (valor T, coordenadas longas...)
Atribui o valor do escalar encontrado nas coordenadas fornecidas.
Para acessar o elemento escalar, o número de coordenadas fornecidas deve ser igual ao número de dimensões deste array (ou seja, sua classificação). Por exemplo:
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
Nota: se este array armazena valores de um tipo primitivo, prefira a utilização do método especializado na subclasse para esse tipo. Por exemplo, floatArray.setFloat(10.0f, 0);
Parâmetros
valor | o valor a atribuir |
---|---|
coordenadas | coordenadas do escalar a ser atribuído |
Devoluções
- esta matriz
Lança
IndexOutOfBoundsException | se algumas coordenadas estiverem fora dos limites de sua respectiva dimensão |
---|---|
IlegalRankException | se o número de coordenadas não for suficiente para acessar um elemento escalar |
public abstract NdArray <T> fatia ( Índice... índices)
Cria uma visualização multidimensional (ou fatia) desta matriz mapeando uma ou mais dimensões para os seletores de índice fornecidos.
As fatias permitem percorrer um array N-dimensional em qualquer um de seus eixos e/ou filtrar apenas os elementos de interesse. Por exemplo, para uma determinada matriz nos eixos [x, y]
, é possível iterar elementos em y=0
para todos x
.
Quaisquer alterações aplicadas à fatia retornada também afetam os dados desta matriz, pois não há cópia envolvida.
Exemplo de uso:
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
});
}
Parâmetros
índices | seletores de índice por dimensões, começando na dimensão 0 desta matriz. |
---|
Devoluções
- o elemento resultante da seleção do índice
Lança
IndexOutOfBoundsException | se algumas coordenadas estiverem fora dos limites de sua respectiva dimensão |
---|
público abstrato NdArray <T> gravação ( DataBuffer <T> src)
Escreva o conteúdo desta matriz N-dimensional do buffer de origem.
O tamanho do buffer deve ser igual ou maior ao size()
deste array, ou uma exceção será lançada. Após a cópia, o conteúdo do buffer e do array podem ser alterados de forma independente, sem afetar um ao outro.
Parâmetros
fonte | o buffer de origem |
---|
Devoluções
- esta matriz
Lança
BufferUnderflowException | se o buffer não tiver dados restantes suficientes para gravar nesta matriz |
---|