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 os arrays multidimensionais padrão em Java mapeando segmentos de dados lineares diretamente na memória.

Como o DataBuffer , NdArray instâncias do NdArray oferecem suporte à indexação de 64 bits, portanto, podem 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 desta matriz para a matriz de destino.
abstract NdArraySequence <? estende NdArray <T>>
elementos (int dimensionIdx)
Retorna uma sequência de todos os elementos em uma determinada dimensão.
booleano abstrato
igual a (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 (long ... coordinates)
Retorna o valor do escalar encontrado nas coordenadas fornecidas.
abstrato NdArray <T>
ler ( DataBuffer <T> dst)
Leia o conteúdo deste array N-dimensional no buffer de destino.
abstract 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, long ... coordenadas)
Atribui o valor do escalar encontrado nas coordenadas fornecidas.
abstrato NdArray <T>
fatia ( índice ... índices)
Cria uma visualização multidimensional (ou fatia) dessa matriz mapeando uma ou mais dimensões para os seletores de índice fornecidos.
abstrato NdArray <T>
escrever ( DataBuffer <T> src)
Grave o conteúdo desta matriz N-dimensional do buffer de origem.

Métodos herdados

Métodos Públicos

public abstract NdArray <T> copyTo ( NdArray <T> dst)

Copie o conteúdo desta matriz para a matriz de destino.

A shape() da matriz de destino deve ser igual à forma desta matriz, ou uma exceção é lançada. Após a cópia, o conteúdo de ambas as matrizes 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

public abstract NdArraySequence <? estende NdArray <t >> elementos (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) elemento precede aqueles do (n) elemento, para um total de valores de 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
dimensionIdx í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

public abstract boolean equals (Object obj)

Verifica a igualdade entre matrizes n-dimensionais.

Uma matriz é igual a outro objeto se este objeto for outro NdArray da mesma forma, 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 esse 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 (long ... coordinates)

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 é 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 afetam os dados desta matriz também, pois não há nenhuma cópia envolvida.

Observe que invocar este método é uma forma equivalente e mais eficiente de array.get(x, y, z) este array em um escalar único, ou seja, array.get(x, y, z) é igual a array.slice(at(x), at(y), at(z))

Parâmetros
coordenadas coordenadas do elemento a acessar, nenhuma retornará esta matriz
Devoluções
  • o elemento neste índice
Lança
IndexOutOfBoundsException se algumas coordenadas estão fora dos limites de suas respectivas dimensões

public abstract T getObject (long ... coordinates)

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 desta matriz (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 o uso do método especializado na subclasse desse tipo. Por exemplo, floatArray.getFloat(0); .

Parâmetros
coordenadas coordenadas do escalar para resolver
Devoluções
  • valor daquele escalar
Lança
IndexOutOfBoundsException se algumas coordenadas estão fora dos limites de suas respectivas dimensões
IllegalRankException se o número de coordenadas não for suficiente para acessar um elemento escalar

public abstract NdArray <T> read ( DataBuffer <T> dst)

Leia o conteúdo deste array N-dimensional no buffer de destino.

O tamanho do buffer deve ser igual ou maior ao size() desta matriz, ou uma exceção é 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 pode conter o conteúdo deste array
Veja também

public abstract 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 ... coordinates)

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
src uma matriz dos valores a serem atribuídos
coordenadas coordenadas do elemento a atribuir
Devoluções
  • esta matriz
Lança
IndexOutOfBoundsException se algumas coordenadas estão fora dos limites de suas respectivas dimensões

public abstract NdArray <T> setObject (valor T, long ... coordinates)

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 desta matriz (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 o uso do método especializado na subclasse desse tipo. Por exemplo, floatArray.setFloat(10.0f, 0);

Parâmetros
valor o valor a ser atribuído
coordenadas coordenadas do escalar para atribuir
Devoluções
  • esta matriz
Lança
IndexOutOfBoundsException se algumas coordenadas estão fora dos limites de suas respectivas dimensões
IllegalRankException se o número de coordenadas não for suficiente para acessar um elemento escalar

fatia public abstract NdArray <T> ( índice ... índices)

Cria uma visualização multidimensional (ou fatia) dessa matriz mapeando uma ou mais dimensões para os seletores de índice fornecidos.

As fatias permitem atravessar uma matriz 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 os elementos em y=0 para todos os x .

Quaisquer alterações aplicadas à fatia retornada afetam os dados dessa matriz também, pois não há nenhuma 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 estão fora dos limites de suas respectivas dimensões

public abstract NdArray <T> write ( DataBuffer <T> src)

Grave o conteúdo desta matriz N-dimensional do buffer de origem.

O tamanho do buffer deve ser igual ou maior ao size() desta matriz, ou uma exceção é 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
src o buffer de origem
Devoluções
  • esta matriz
Lança
BufferUnderflowException se o buffer não tiver dados restantes suficientes para gravar neste array
Veja também