我对使用C代码(因此,只使用循环)排列d维张量的元素感兴趣,我想用d作为参数来编写函数。
到目前为止,张量数据包含在一个“d维”指针中(例如,当d=1时是一个简单数组)。到目前为止,我已经用**T静态地定义了这个指针,d=2,尽管这里给出了动态方法的指示:Create a d-dimensional pointer
如何在不使用(脏)if循环的情况下使用d作为参数编写代码:

if (d == 2) {
specific code for permuting
}
else if (d == 3) {
other specific code
}

?
注意,置换顺序是函数的输入。
谢谢您,

最佳答案

编辑:看来我误解了这个问题。但是下面的答案仍然与主题相关,所以我暂时不打算删除它。
答案可能是针对这个问题的,也许permutingd == 2的代码可以简化为与d == 3相同的代码。我不知道代码会是什么样子,因为我没有研究过张量,但如果它是不可约的,那么你有“脏”的方法是你最好的选择。
或者,如果维度数#defined与链接后的指针表示类似,则可以使用预处理器指令打开/关闭额外循环。这会给你一点更简洁的代码。可能看起来像:

#define D 4 // Number of dimensions to use
#define MAX_D 10 // maximum # of dimensions
...
#if D >= MAX_D
for(int i = 0; i < dimensions[MAX_D - 1]; i++) {
#endif
...
#if D >= 2
for(int i = 0; i < dimensions[1]; i++) {
#endif
// Base case ; D == 1
for(int i = 0; i < dimensions[0]; i++) {
    // Permutation stuff here
}
#if D == 2
}
#elif D == 3
}}
#elif D == 4
}}}
....
#endif

虽然这有点难看,但它使您不必创建和维护一堆不同的版本。
所提供的链接确实是创建用C表示的d维数组的最佳方法。但是,您可以用1-d数组和一些数学知识来模拟d维数组。
您可以使用以下功能来实现此目的:
void get(int *d_dimens, int d, size_t *dimensions, size_t *point, int val) {
    size_t index = 0; // Index of the number
    size_t dim = 1; // Location of the current dimension
    for(int i = 0; i < d; i++) {
        index += point[i] * dim;
        dim *= dimensions[i];
    }
    return d_dimens[index];
}

void set(int *d_dimens, int d, size_t *dimensions, size_t *point, int val) {
    size_t index = 0; // Index of the number
    size_t dim = 1; // Location of the current dimension
    for(int i = 0; i < d; i++) {
        index += point[i] * dim;
        dim *= dimensions[i];
    }
    d_dimens[index] = val;
}

int *create(int d, size_t *dimensions) {
    sizt_t num_elems = 1;
    for(int i = 0; i < d; i++)
        num_elems *= dimensions[i];
    int *ptr = malloc(sizeof (int) * num_elems);
    return ptr;
}

其中,dimensions是一个维度数组,d_dimens是我们用来模拟D-D数组的一维数组,d是维度数。例如,如果您想要4x5x2阵列,您可以使用dimensions = {4, 5, 2}; d = 3;

08-18 15:52