将存储器的连续块投射到高维数组中以便于索引编制

问题描述 投票:0回答:2

我有一个传递线性存储器块的函数,该块对行主要存储的高维矩阵(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]
}
c
2个回答
0
投票

您可以为此使用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
}

0
投票

假设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。此级别)。

© www.soinside.com 2019 - 2024. All rights reserved.