我有一个传递线性存储器块的函数,该块对行主要存储的高维矩阵(3d,4d,...)进行编码。
是否有一种方法可以转换内存,以便可以进行有效的多维索引?
void do_something_in_4d(float* input, int dim1, int dim2, int dim3, int dim4) {
// input_4d = (some casting magic) input
int i = 1;
int j = 2;
int m = 3;
int n = 4;
// input_4d[i][j][m][n] == input[i*dim2*dim3*dim4 + j*dim3*dim4 + m*dim4 + n]
}
您可以为此使用C99可变长度数组。请注意,万一您需要兼容性,到目前为止,任何C ++版本都不支持它们,并且MSVC之类的编译器(截至2019年)不实现它们。
现在,虽然通常看到的形式是能够像堆栈变量一样执行int arr[n]
或int arr[w][h]
之类的功能,但实际上它确实也适用于指针。
#include <stdlib.h>
#include <stdio.h>
void matrix_print(int x, int y, int z, int w, float (*matrix_4d)[y][z][w]);
void matrix_set(int x, int y, int z, int w, float (*matrix_4d)[y][z][w]);
int main()
{
int width = 3;
float matrix2[] = {0, 1, 2, 3, 4, 5};
float (*matrix_2d)[width] = (float(*)[width])matrix2;
printf("%f\n", matrix_2d[0][0]); // 0
printf("%f\n", matrix_2d[0][1]); // 1
printf("%f\n", matrix_2d[0][2]); // 2
printf("%f\n", matrix_2d[1][0]); // 3
printf("%f\n", matrix_2d[1][1]); // 4
printf("%f\n", matrix_2d[1][2]); // 5
int x=2,y=3,z=4,w=5;
float *matrix4 = malloc(sizeof(float)*x*y*z*w);
float (*matrix_4d)[y][z][w] = (float (*)[y][z][w]) matrix4;
matrix_set(x, y, z, w, matrix_4d);
printf("1D matrix\n");
for (int i = 0; i < x*y*z*w; ++i)
printf("%f\n", matrix4[i]); // 0 to 119
matrix_print(x, y, z, w, matrix_4d);
}
void matrix_set(int x, int y, int z, int w, float (*matrix_4d)[y][z][w])
{
int i = 0;
for (int xi = 0; xi < x; ++xi)
for (int yi = 0; yi < y; ++yi)
for (int zi = 0; zi < z; ++zi)
for (int wi = 0; wi < w; ++wi, ++i)
matrix_4d[xi][yi][zi][wi] = i;
}
void matrix_print(int x, int y, int z, int w, float (*matrix_4d)[y][z][w])
{
printf("4D\n");
printf("%f\n", matrix_4d[0][0][0][0]); // 0
printf("%f\n", matrix_4d[0][0][0][1]); // 1
printf("%f\n", matrix_4d[0][0][1][0]); // 5
printf("%f\n", matrix_4d[0][1][0][0]); // 20
printf("%f\n", matrix_4d[1][0][0][0]); // 24
printf("%f\n", matrix_4d[1][2][3][4]); // 119
}
假设3维数组为2 * 3 * 4,一维(实际)数组的元素为:
[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
然后将以这种方式表示它们->
1 2 -+
3 4 |___PAGE 1
5 6 -+
7 8 -+
9 10 |___PAGE 2
11 12-+
13 14 -+
15 16 |__PAGE 3
17 18 -+
19 20 -+
21 |__PAGE 4
-+
现在想象每个PAGE
位于上一个之上。然后,在PAGE
上遇到每个第3个整数时,您可以将row_count(最初为0)递增,当row_count为3(AND元素数为6)时,对于下一个元素,您可以再次为level_3d_count和row_count递增0。此级别)。