置换C

时间:2017-12-10 21:44:08

标签: c arrays

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

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

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

2 个答案:

答案 0 :(得分:0)

编辑:我似乎误解了这个问题。但是,以下答案仍然与该主题相关,因此我暂时不会将其删除。

答案可能是特定于问题的,也许代替d == 2的代码可以减少到与d == 3相同。我不确切地知道代码会是什么样子,因为我没有研究张量,但如果它不可简化,那么"脏"你拥有的方法是你最好的选择。

或者,如果您的维度#define d与您链接的帖子中的指针表示相似,则可以使用预处理器指令打开/关闭额外的循环。这应该会给你一些更精简的代码。它应该看起来像:

#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数组的1-D数组,d是维数。例如,如果您需要4x5x2阵列,则可以使用dimensions = {4, 5, 2}; d = 3;

答案 1 :(得分:0)

  

到目前为止,我已经为d = 2用** T静态定义了该指针,尽管这里给出了一种动态方法的指示:…

我建议不要使用多维指针,除非需要稀疏存储。取而代之的是,看到对问题How does NumPy's transpose() method permute the axes of an array?的这个很好说明的答案,正如那里所解释的那样,通过这种方案,张量值甚至不需要为转置操作复制。