ndarray function

List ndarray(
  1. List<int> shape,
  2. Struct s,
  3. List<int> buffer,
  4. int offset,
)

Constructs an n-dimensional array from a buffer based on the given shape and format.

Implementation

List<dynamic> ndarray(List<int> shape, Struct s, List<int> buffer, int offset) {
  NumConversionFunction func;
  if (s.format == "<H") {
    func = bytesToInt;
  } else if (s.format == "<f") {
    func = bytesToFloat;
  } else {
    throw ArgumentError("Format should be <H or <f");
  }

  final List<dynamic> matrix = [];

  if (shape.length == 2) {
    for (int i = 0; i < shape[0]; i++) {
      List<dynamic> row = [];
      for (int j = 0; j < shape[1]; j++) {
        row.add(func(buffer.sublist(offset, offset + s.size)));
        offset += s.size;
      }
      matrix.add(row);
    }
  } else if (shape.length == 3) {
    for (int i = 0; i < shape[0]; i++) {
      List<dynamic> innerMatrix = [];
      for (int j = 0; j < shape[1]; j++) {
        List<dynamic> row = [];
        for (int k = 0; k < shape[2]; k++) {
          row.add(func(buffer.sublist(offset, offset + s.size)));
          offset += s.size;
        }
        innerMatrix.add(row);
      }
      matrix.add(innerMatrix);
    }
  } else if (shape.length == 4) {
    for (int i = 0; i < shape[0]; i++) {
      List<dynamic> innerMatrix1 = [];
      for (int j = 0; j < shape[1]; j++) {
        List<dynamic> innerMatrix2 = [];
        for (int k = 0; k < shape[2]; k++) {
          List<dynamic> innerMatrix3 = [];
          for (int l = 0; l < shape[3]; l++) {
            innerMatrix3.add(func(buffer.sublist(offset, offset + s.size)));
            offset += s.size;
          }
          innerMatrix2.add(innerMatrix3);
        }
        innerMatrix1.add(innerMatrix2);
      }
      matrix.add(innerMatrix1);
    }
  } else {
    throw ArgumentError("Shape length must be 2, 3, or 4.");
  }

  return matrix;
}