NdArray

giao diện công cộng NdArray
Các lớp con gián tiếp đã biết

Cấu trúc dữ liệu có kích thước N.

Giao diện `NdArray` tạo ra sự trừu tượng giữa bộ lưu trữ vật lý của bản ghi dữ liệu, có thể là tuyến tính hoặc phân đoạn và cách biểu diễn logic của nó. Nói chung, chúng đạt được hiệu suất tốt hơn mảng đa chiều tiêu chuẩn trong Java bằng cách ánh xạ trực tiếp các phân đoạn dữ liệu tuyến tính trong bộ nhớ.

Giống như DataBuffer , các phiên bản NdArray hỗ trợ lập chỉ mục 64 bit để chúng có thể được sử dụng để ánh xạ các bản ghi dữ liệu rất lớn. Chúng cũng hỗ trợ các tọa độ đặc biệt cho phép di chuyển ngang các giá trị của chúng theo bất kỳ hướng nào hoặc chỉ chọn một tập hợp con trong số chúng.

Ví dụ về cách sử dụng:

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

Phương pháp công khai

trừu tượng NdArray <T>
sao chépTo ( NdArray <T> dst)
Sao chép nội dung của mảng này vào mảng đích.
trừu tượng NdArraySequence <? mở rộng NdArray <T>>
các phần tử (int DimensionIdx)
Trả về một chuỗi gồm tất cả các phần tử ở một thứ nguyên nhất định.
trừu tượng boolean
bằng (Đối tượng obj)
Kiểm tra sự bằng nhau giữa các mảng n chiều.
trừu tượng NdArray <T>
lấy (tọa độ... dài)
Trả về phần tử N chiều của mảng này tại tọa độ đã cho.
trừu tượng T
getObject (tọa độ dài...)
Trả về giá trị của đại lượng vô hướng được tìm thấy tại tọa độ đã cho.
trừu tượng NdArray <T>
đọc ( Bộ đệm dữ liệu <T> dst)
Đọc nội dung của mảng N chiều này vào bộ đệm đích.
trừu tượng NdArraySequence <? mở rộng NdArray <T>>
vô hướng ()
Trả về một chuỗi tất cả các đại lượng vô hướng trong mảng này.
trừu tượng NdArray <T>
đặt ( NdArray <T> src, tọa độ dài...)
Gán giá trị của phần tử N chiều được tìm thấy tại tọa độ đã cho.
trừu tượng NdArray <T>
setObject (giá trị T, tọa độ dài...)
Gán giá trị của đại lượng vô hướng được tìm thấy tại tọa độ đã cho.
trừu tượng NdArray <T>
lát ( Chỉ mục... chỉ số)
Tạo chế độ xem đa chiều (hoặc lát) của mảng này bằng cách ánh xạ một hoặc nhiều thứ nguyên tới các bộ chọn chỉ mục đã cho.
trừu tượng NdArray <T>
viết ( DataBuffer <T> src)
Viết nội dung của mảng N chiều này từ bộ đệm nguồn.

Phương pháp kế thừa

Phương pháp công khai

tóm tắt công khai NdArray <T> copyTo ( NdArray <T> dst)

Sao chép nội dung của mảng này vào mảng đích.

shape() của mảng đích phải bằng hình dạng của mảng này, nếu không sẽ xảy ra ngoại lệ. Sau khi sao chép, nội dung của cả hai mảng có thể được thay đổi độc lập mà không ảnh hưởng lẫn nhau.

Thông số
dst mảng để nhận bản sao nội dung của mảng này
Trả lại
  • mảng này
Ném
Ngoại lệ Đối số bất hợp pháp nếu hình dạng của dst không bằng hình dạng của mảng này

tóm tắt công khai NdArraySequence <? mở rộng các phần tử NdArray <T>> (int DimensionIdx)

Trả về một chuỗi gồm tất cả các phần tử ở một thứ nguyên nhất định.

Về mặt logic, mảng N chiều có thể được làm phẳng trong một vectơ duy nhất, trong đó các giá trị vô hướng của phần tử thứ (n - 1) đứng trước các giá trị của phần tử thứ (n) , cho tổng giá trị size() .

Ví dụ: cho ma trận nxm trên trục [x, y] , các phần tử được lặp theo thứ tự sau:

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

Sau đó, chuỗi trả về có thể được lặp lại để truy cập từng phần tử, bằng cách gọi forEach(Consumer) hoặc 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);
    });
 }

Thông số
Idx thứ nguyên chỉ số của kích thước
Trả lại
  • một chuỗi NdArray
Ném
Ngoại lệ Đối số bất hợp pháp nếu dimensionIdx lớn hơn hoặc bằng tổng số thứ nguyên của mảng này

boolean trừu tượng công khai bằng (Object obj)

Kiểm tra sự bằng nhau giữa các mảng n chiều.

Một mảng bằng một đối tượng khác nếu đối tượng này là một NdArray khác có cùng hình dạng, kiểu và các phần tử bằng nhau và theo cùng thứ tự. Ví dụ:

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
 }

Lưu ý rằng việc tính toán cần thiết để xác minh sự bằng nhau giữa hai mảng có thể tốn kém trong một số trường hợp và do đó, bạn không nên sử dụng phương pháp này trong đường dẫn quan trọng nơi hiệu suất đóng vai trò quan trọng.

Thông số
vật thể đối tượng để so sánh mảng này với
Trả lại
  • đúng nếu mảng này bằng đối tượng được cung cấp

tóm tắt công khai NdArray <T> get (tọa độ... dài)

Trả về phần tử N chiều của mảng này tại tọa độ đã cho.

Các phần tử có kích thước bất kỳ của mảng này đều có thể được truy xuất. Ví dụ: nếu số tọa độ bằng số thứ nguyên của mảng này thì mảng xếp hạng 0 (vô hướng) sẽ được trả về, sau đó có thể nhận được giá trị nào bằng cách gọi `array.getObject()`.

Bất kỳ thay đổi nào được áp dụng cho các phần tử được trả về cũng ảnh hưởng đến dữ liệu của mảng này vì không có bản sao nào liên quan.

Lưu ý rằng việc gọi phương thức này là một cách tương đương và hiệu quả hơn để cắt mảng này theo một vô hướng đơn, tức là array.get(x, y, z) bằng array.slice(at(x), at(y), at(z))

Thông số
tọa độ tọa độ của phần tử cần truy cập, không có phần tử nào sẽ trả về mảng này
Trả lại
  • phần tử tại chỉ mục này
Ném
IndexOutOfBoundsNgoại lệ nếu một số tọa độ nằm ngoài giới hạn của kích thước tương ứng của chúng

tóm tắt công khai T getObject (tọa độ... dài)

Trả về giá trị của đại lượng vô hướng được tìm thấy tại tọa độ đã cho.

Để truy cập phần tử vô hướng, số tọa độ được cung cấp phải bằng số chiều của mảng này (tức là thứ hạng của nó). Ví dụ:

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
 
Lưu ý: nếu mảng này lưu trữ các giá trị của kiểu nguyên thủy, hãy ưu tiên sử dụng phương thức chuyên biệt trong lớp con cho kiểu đó. Ví dụ: floatArray.getFloat(0); .

Thông số
tọa độ tọa độ của vô hướng để giải quyết
Trả lại
  • giá trị của đại lượng đó
Ném
IndexOutOfBoundsNgoại lệ nếu một số tọa độ nằm ngoài giới hạn của kích thước tương ứng của chúng
Xếp hạng bất hợp phápNgoại lệ nếu số tọa độ không đủ để truy cập phần tử vô hướng

tóm tắt công khai NdArray <T> đọc ( DataBuffer <T> dst)

Đọc nội dung của mảng N chiều này vào bộ đệm đích.

Kích thước của bộ đệm phải bằng hoặc lớn hơn size() của mảng này, nếu không sẽ xảy ra ngoại lệ. Sau khi sao chép, nội dung của bộ đệm và mảng có thể được thay đổi độc lập mà không ảnh hưởng lẫn nhau.

Thông số
dst bộ đệm đích
Trả lại
  • mảng này
Ném
BufferOverflowNgoại lệ nếu bộ đệm không thể chứa nội dung của mảng này
Xem thêm

tóm tắt công khai NdArraySequence <? mở rộng NdArray <T>> vô hướng ()

Trả về một chuỗi tất cả các đại lượng vô hướng trong mảng này.

Điều này tương đương với elements(shape().numDimensions() - 1)

Trả lại
  • một chuỗi NdArray

tóm tắt công khai tập hợp NdArray <T> ( NdArray <T> src, tọa độ dài...)

Gán giá trị của phần tử N chiều được tìm thấy tại tọa độ đã cho.

Số tọa độ được cung cấp có thể nằm trong khoảng từ 0 đến hạng - 1. Ví dụ:

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
 

Thông số
src một mảng các giá trị để gán
tọa độ tọa độ của phần tử cần gán
Trả lại
  • mảng này
Ném
IndexOutOfBoundsNgoại lệ nếu một số tọa độ nằm ngoài giới hạn của kích thước tương ứng của chúng

tóm tắt công khai NdArray <T> setObject (giá trị T, tọa độ dài...)

Gán giá trị của đại lượng vô hướng được tìm thấy tại tọa độ đã cho.

Để truy cập phần tử vô hướng, số tọa độ được cung cấp phải bằng số chiều của mảng này (tức là thứ hạng của nó). Ví dụ:

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
 
Lưu ý: nếu mảng này lưu trữ các giá trị của kiểu nguyên thủy, hãy ưu tiên sử dụng phương thức chuyên biệt trong lớp con cho kiểu đó. Ví dụ: floatArray.setFloat(10.0f, 0);

Thông số
giá trị giá trị để gán
tọa độ tọa độ của vô hướng để gán
Trả lại
  • mảng này
Ném
IndexOutOfBoundsNgoại lệ nếu một số tọa độ nằm ngoài giới hạn của kích thước tương ứng của chúng
Xếp hạng bất hợp phápNgoại lệ nếu số tọa độ không đủ để truy cập phần tử vô hướng

tóm tắt công khai lát cắt NdArray <T> ( Chỉ mục... chỉ mục)

Tạo chế độ xem đa chiều (hoặc lát) của mảng này bằng cách ánh xạ một hoặc nhiều thứ nguyên tới các bộ chọn chỉ mục đã cho.

Các lát cắt cho phép duyệt qua một mảng N chiều theo bất kỳ trục nào của nó và/hoặc chỉ lọc các phần tử quan tâm. Ví dụ: đối với một ma trận nhất định trên trục [x, y] , có thể lặp lại các phần tử tại y=0 cho tất cả x .

Bất kỳ thay đổi nào được áp dụng cho lát cắt được trả về cũng ảnh hưởng đến dữ liệu của mảng này vì không có bản sao nào liên quan.

Ví dụ về cách sử dụng:

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

Thông số
chỉ số bộ chọn chỉ mục cho mỗi thứ nguyên, bắt đầu từ thứ nguyên 0 của mảng này.
Trả lại
  • phần tử kết quả của việc lựa chọn chỉ mục
Ném
IndexOutOfBoundsNgoại lệ nếu một số tọa độ nằm ngoài giới hạn của kích thước tương ứng của chúng

tóm tắt công khai NdArray <T> ghi ( DataBuffer <T> src)

Viết nội dung của mảng N chiều này từ bộ đệm nguồn.

Kích thước của bộ đệm phải bằng hoặc lớn hơn size() của mảng này, nếu không sẽ xảy ra ngoại lệ. Sau khi sao chép, nội dung của bộ đệm và mảng có thể được thay đổi độc lập mà không ảnh hưởng lẫn nhau.

Thông số
src bộ đệm nguồn
Trả lại
  • mảng này
Ném
Bộ đệmUnderflowNgoại lệ nếu bộ đệm không còn đủ dữ liệu để ghi vào mảng này
Xem thêm