ndarray function
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;
}