static void convertArrayDim(size_t dim, const BaseArray<S> &s, vector<size_t> &sidx, BaseArray<T> &d, vector<size_t> &didx) { size_t ndims = s.getNumDims(); size_t size = s.getDim(dim); for (size_t i = 1; i <= size; i++) { didx[ndims - dim] = sidx[dim - 1] = i; if (dim < sidx.size()) convertArrayDim(dim + 1, s, sidx, d, didx); else d(didx) = s(sidx); } }
static size_t assignRowMajorDim(size_t dim, const T* data, BaseArray<T> &array, vector<size_t> &idx) { size_t processed = 0; size_t size = array.getDim(dim); for (size_t i = 1; i <= size; i++) { idx[dim - 1] = i; if (dim < idx.size()) processed += assignRowMajorDim(dim + 1, data + processed, array, idx); else array(idx) = data[processed++]; } return processed; }
void transpose_array(const BaseArray<T>& x, BaseArray<T>& a) { size_t ndims = x.getNumDims(); if(ndims < 2 || ndims != a.getNumDims()) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Wrong dimensions in transpose_array"); vector<size_t> ex = x.getDims(); std::swap(ex[0], ex[1]); a.setDims(ex); vector<Slice> sx(ndims); vector<Slice> sa(ndims); for (int i = 1; i <= x.getDim(1); i++) { sa[1] = sx[0] = Slice(i); ArraySlice<T>(a, sa).assign(ArraySliceConst<T>(x, sx)); } }
void multiply_array(const BaseArray<T> &leftArray, const BaseArray<T> &rightArray, BaseArray<T> &resultArray) { size_t leftNumDims = leftArray.getNumDims(); size_t rightNumDims = rightArray.getNumDims(); size_t matchDim = rightArray.getDim(1); resultArray.setDims(leftArray.getDims()); if (leftArray.getDim(leftNumDims) != matchDim) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Wrong sizes in multiply_array"); if (leftNumDims == 1 && rightNumDims == 2) { size_t rightDim = rightArray.getDim(2); for (size_t j = 1; j <= rightDim; j++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) val += leftArray(k) * rightArray(k, j); resultArray(j) = val; } } else if (leftNumDims == 2 && rightNumDims == 1) { size_t leftDim = leftArray.getDim(1); for (size_t i = 1; i <= leftDim; i++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) val += leftArray(i, k) * rightArray(k); resultArray(i) = val; } } else if (leftNumDims == 2 && rightNumDims == 2) { size_t leftDim = leftArray.getDim(1); size_t rightDim = rightArray.getDim(2); for (size_t i = 1; i <= leftDim; i++) { for (size_t j = 1; j <= rightDim; j++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) val += leftArray(i, k) * rightArray(k, j); resultArray(i, j) = val; } } } else throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Unsupported dimensions in multiply_array"); }