NdArray

interface pública NdArray
Subclasses indiretas conhecidas

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>
copyTo ( NdArray <T> dst)
Copie o conteúdo deste array para o array de destino.
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>
ler ( DataBuffer <T> dst)
Leia o conteúdo desta matriz N-dimensional no buffer de destino.
abstrato NdArraySequence <? estende NdArray <T>>
escalares ()
Retorna uma sequência de todos os escalares nesta matriz.
abstrato NdArray <T>
set ( NdArray <T> src, long... coordenadas)
Atribui o valor do elemento N-dimensional encontrado nas coordenadas fornecidas.
abstrato NdArray <T>
setObject (valor T, coordenadas longas)
Atribui o valor do escalar encontrado nas coordenadas fornecidas.
abstrato 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.
abstrato NdArray <T>
escrever ( DataBuffer <T> src)
Escreva o conteúdo desta matriz N-dimensional do buffer de origem.

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
DST array para receber uma cópia do conteúdo deste array
Devoluções
  • esta matriz
Lança
Exceção de argumento ilegal 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 achatada 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
Exceção de argumento ilegal 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
DST o buffer de destino
Devoluções
  • esta matriz
Lança
BufferOverflowException se o buffer não puder conter o conteúdo deste array
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
Veja também