NdArray

antarmuka publik NdArray
Subkelas Tidak Langsung yang Diketahui

Struktur data N-dimensi.

Antarmuka `NdArray` membuat abstraksi antara penyimpanan fisik rekaman data, yang bisa linier atau tersegmentasi, dan representasi logisnya. Secara umum, mereka mencapai performa yang lebih baik daripada array multidimensi standar di Java dengan memetakan segmen data linier secara langsung di memori.

Seperti DataBuffer , instans NdArray mendukung pengindeksan 64-bit sehingga dapat digunakan untuk memetakan rekaman data yang sangat besar. Mereka juga mendukung koordinat khusus yang memungkinkan melintasi nilainya ke segala arah atau untuk memilih hanya sebagian saja.

Contoh penggunaan:

// 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));
 

Metode Publik

abstrak NdArray <T>
salinKe ( NdArray <T> dst)
Salin konten array ini ke array tujuan.
abstrak NdArraySequence <? memperluas NdArray <T>>
elemen (int dimensiIdx)
Mengembalikan urutan semua elemen pada dimensi tertentu.
boolean abstrak
sama dengan (Objek objek)
Memeriksa kesetaraan antara array n-dimensi.
abstrak NdArray <T>
dapatkan (panjang...koordinat)
Mengembalikan elemen berdimensi N dari larik ini pada koordinat yang ditentukan.
abstrak T
getObject (panjang...koordinat)
Mengembalikan nilai skalar yang ditemukan pada koordinat tertentu.
abstrak NdArray <T>
baca ( DataBuffer <T> dst)
Baca konten array N-dimensi ini ke dalam buffer tujuan.
abstrak NdArraySequence <? memperluas NdArray <T>>
skalar ()
Mengembalikan urutan semua skalar dalam larik ini.
abstrak NdArray <T>
set ( NdArray <T> src, panjang... koordinat)
Menetapkan nilai elemen berdimensi N yang ditemukan pada koordinat tertentu.
abstrak NdArray <T>
setObject (nilai T, panjang... koordinat)
Menetapkan nilai skalar yang ditemukan pada koordinat yang diberikan.
abstrak NdArray <T>
irisan ( Indeks... indeks)
Membuat tampilan (atau potongan) multidimensi dari larik ini dengan memetakan satu atau lebih dimensi ke pemilih indeks tertentu.
abstrak NdArray <T>
menulis ( DataBuffer <T> src)
Tulis konten array N-dimensi ini dari buffer sumber.

Metode Warisan

Metode Publik

abstrak publik NdArray <T> copyTo ( NdArray <T> dst)

Salin konten array ini ke array tujuan.

shape() array tujuan harus sama dengan bentuk array ini, atau pengecualian akan dilemparkan. Setelah penyalinan, konten kedua array dapat diubah secara independen, tanpa mempengaruhi satu sama lain.

Parameter
dst array untuk menerima salinan konten array ini
Kembali
  • susunan ini
Melempar
Pengecualian Argumen Ilegal jika bentuk dst tidak sama dengan bentuk array ini

abstrak publik NdArraySequence <? memperluas elemen NdArray <T>> (int DimensionIdx)

Mengembalikan urutan semua elemen pada dimensi tertentu.

Logikanya, array berdimensi-N dapat diratakan dalam satu vektor, dengan skalar elemen ke- (n - 1) mendahului skalar elemen ke- (n) , dengan total nilai size() .

Misalnya, jika diberi matriks nxm pada sumbu [x, y] , elemen akan diiterasi dengan urutan sebagai berikut:

x 0 kamu 0 , x 0 kamu 1 , ..., x 0 kamu m-1 , x 1 kamu 0 , x 1 kamu 1 , ..., x n-1 kamu m-1

Urutan yang dikembalikan kemudian dapat diulang untuk mengunjungi setiap elemen, baik dengan memanggil forEach(Consumer) atau 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);
    });
 }

Parameter
dimensiIdx indeks dimensi
Kembali
  • urutan NdArray
Melempar
Pengecualian Argumen Ilegal jika dimensionIdx lebih besar atau sama dengan jumlah total dimensi array ini

boolean abstrak publik sama dengan (Obj objek)

Memeriksa kesetaraan antara array n-dimensi.

Sebuah array sama dengan objek lain jika objek tersebut adalah NdArray lain dengan bentuk, tipe, dan elemen yang sama serta dalam urutan yang sama. Misalnya:

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
 }

Perhatikan bahwa komputasi yang diperlukan untuk memverifikasi kesetaraan antara dua larik bisa jadi mahal dalam beberapa kasus dan oleh karena itu, disarankan untuk tidak menggunakan metode ini di jalur kritis yang mengutamakan performa.

Parameter
keberatan objek untuk membandingkan array ini
Kembali
  • benar jika larik ini sama dengan objek yang disediakan

abstrak publik NdArray <T> dapatkan (koordinat... panjang)

Mengembalikan elemen berdimensi N dari larik ini pada koordinat yang ditentukan.

Elemen dari dimensi mana pun dari array ini dapat diambil. Misalnya, jika jumlah koordinat sama dengan jumlah dimensi array ini, maka array peringkat-0 (skalar) dikembalikan, yang nilainya kemudian dapat diperoleh dengan memanggil `array.getObject()`.

Setiap perubahan yang diterapkan pada elemen yang dikembalikan juga akan memengaruhi data array ini, karena tidak ada penyalinan yang terlibat.

Perhatikan bahwa menjalankan metode ini adalah cara yang setara dan lebih efisien untuk mengiris array ini pada skalar tunggal, yaitu array.get(x, y, z) sama dengan array.slice(at(x), at(y), at(z))

Parameter
koordinat koordinat elemen yang akan diakses, tidak ada yang akan mengembalikan array ini
Kembali
  • elemen pada indeks ini
Melempar
IndexOutOfBoundsException jika beberapa koordinat berada di luar batas dimensinya masing-masing

abstrak publik T getObject (panjang... koordinat)

Mengembalikan nilai skalar yang ditemukan pada koordinat tertentu.

Untuk mengakses elemen skalar, jumlah koordinat yang diberikan harus sama dengan jumlah dimensi array ini (yaitu peringkatnya). Misalnya:

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
 
Catatan: jika array ini menyimpan nilai tipe primitif, pilihlah penggunaan metode khusus di subkelas untuk tipe tersebut. Misalnya, floatArray.getFloat(0); .

Parameter
koordinat koordinat skalar yang akan diselesaikan
Kembali
  • nilai skalar itu
Melempar
IndexOutOfBoundsException jika beberapa koordinat berada di luar batas dimensinya masing-masing
IlegalRankException jika jumlah koordinat tidak cukup untuk mengakses elemen skalar

abstrak publik NdArray <T> baca ( DataBuffer <T> dst)

Baca konten array N-dimensi ini ke dalam buffer tujuan.

Ukuran buffer harus sama atau lebih besar dengan size() array ini, atau pengecualian akan dilemparkan. Setelah penyalinan, konten buffer dan array dapat diubah secara independen, tanpa mempengaruhi satu sama lain.

Parameter
dst penyangga tujuan
Kembali
  • susunan ini
Melempar
Pengecualian BufferOverflow jika buffer tidak dapat menampung konten array ini
Lihat juga

abstrak publik NdArraySequence <? memperluas NdArray <T>> skalar ()

Mengembalikan urutan semua skalar dalam larik ini.

Ini setara dengan elements(shape().numDimensions() - 1)

Kembali
  • urutan NdArray

abstrak publik NdArray <T> set ( NdArray <T> src, panjang... koordinat)

Menetapkan nilai elemen berdimensi N yang ditemukan pada koordinat tertentu.

Jumlah koordinat yang diberikan bisa berkisar antara 0 dan peringkat - 1. Contoh:

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
 

Parameter
src array nilai yang akan ditetapkan
koordinat koordinat elemen yang akan ditetapkan
Kembali
  • susunan ini
Melempar
IndexOutOfBoundsException jika beberapa koordinat berada di luar batas dimensinya masing-masing

public abstract NdArray <T> setObject (nilai T, panjang... koordinat)

Menetapkan nilai skalar yang ditemukan pada koordinat yang diberikan.

Untuk mengakses elemen skalar, jumlah koordinat yang diberikan harus sama dengan jumlah dimensi array ini (yaitu peringkatnya). Misalnya:

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
 
Catatan: jika array ini menyimpan nilai tipe primitif, pilihlah penggunaan metode khusus di subkelas untuk tipe tersebut. Misalnya, floatArray.setFloat(10.0f, 0);

Parameter
nilai nilai yang akan diberikan
koordinat koordinat skalar yang akan ditetapkan
Kembali
  • susunan ini
Melempar
IndexOutOfBoundsException jika beberapa koordinat berada di luar batas dimensinya masing-masing
IlegalRankException jika jumlah koordinat tidak cukup untuk mengakses elemen skalar

abstrak publik NdArray <T> irisan ( Indeks... indeks)

Membuat tampilan (atau potongan) multidimensi dari larik ini dengan memetakan satu atau lebih dimensi ke pemilih indeks tertentu.

Irisan memungkinkan untuk melintasi array berdimensi N di salah satu sumbunya dan/atau memfilter hanya elemen yang diinginkan. Misalnya, untuk matriks tertentu pada sumbu [x, y] , dimungkinkan untuk melakukan iterasi elemen pada y=0 untuk semua x .

Perubahan apa pun yang diterapkan pada potongan yang dikembalikan akan memengaruhi data array ini juga, karena tidak ada salinan yang terlibat.

Contoh penggunaan:

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
    });
 }

Parameter
indeks pemilih indeks per dimensi, mulai dari dimensi 0 array ini.
Kembali
  • elemen hasil pemilihan indeks
Melempar
IndexOutOfBoundsException jika beberapa koordinat berada di luar batas dimensinya masing-masing

abstrak publik NdArray <T> tulis ( DataBuffer <T> src)

Tulis konten array N-dimensi ini dari buffer sumber.

Ukuran buffer harus sama atau lebih besar dengan size() array ini, atau pengecualian akan dilemparkan. Setelah penyalinan, konten buffer dan array dapat diubah secara independen, tanpa mempengaruhi satu sama lain.

Parameter
src penyangga sumber
Kembali
  • susunan ini
Melempar
BufferUnderflowException jika buffer tidak memiliki sisa data yang cukup untuk ditulis ke dalam array ini
Lihat juga