digitalmars.D.learn - How to dynamically calculate an index?
- ananymouse (16/16) Jul 12 2022 Given a 3D matrix of shape[3, 5, 7] that is implemented using a
- anonymouse (23/27) Jul 12 2022 My current implementation:
- anonymouse (12/15) Jul 12 2022 Wait, I think I've got it.
Given a 3D matrix of shape[3, 5, 7] that is implemented using a 1D array, I can calculate the index of any element (e.g. [1, 0, 6]) as follows: index = 1 * 5 * 7 + 0 * 7 + 6 In general, if I have a K x L x M matrix, I can access index[i][j][k] by calculating i*L*M + j*M + k to yield the index. Likewise, when working with a 4D matrix[h][i][j][k], I can achieve the same by calculating h*L*M*N + i*M*N + j*N + k. If I have both the index ([i, j, k]) and the shape ([K, L, M]) stored in two separate arrays of equal length, how could I dynamically generate the above calculations for any two such arrays of arbitrary length 3 or greater? Been racking my brain on this for hours. Please point me in the right direction. Thanks, --anonymouse
Jul 12 2022
On Tuesday, 12 July 2022 at 14:17:36 UTC, ananymouse wrote:Been racking my brain on this for hours. Please point me in the right direction. Thanks, --anonymouseMy current implementation: ``` d // Allow for indexing to read a value, e.g a[0,0,0] T opIndex(A...)(A a) { static if(a.length == 3) { int index = a[0] * dims[1] * dims[2] + a[2]; return data[index]; } else static if(a.length == 2) { return data[a[0] * dims[1] + a[1]; } else static if (a.length == 1) { return data[0] } assert(0); } ``` This does not scale well. Therefore, I'd like to change the first if statement to work with any array.length > 2 and dynamically generate the code. I've tried using a foreach loop to achieve this but failed miserably. --anonymouse
Jul 12 2022
On Tuesday, 12 July 2022 at 14:55:47 UTC, anonymouse wrote:I've tried using a foreach loop to achieve this but failed miserably. --anonymouseWait, I think I've got it. This little snippet does the trick: int index; foreach(i, v; a) { int t = v; foreach(d; dims[i+1 .. a.length]) tmp *= d; index += tmp; } Thanks, everyone. --anonymouse
Jul 12 2022