我对使用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
相同的代码。我不知道代码会是什么样子,因为我没有研究过张量,但如果它是不可约的,那么你有“脏”的方法是你最好的选择。
或者,如果维度数#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数组的一维数组,d
是维度数。例如,如果您想要4x5x2阵列,您可以使用dimensions = {4, 5, 2}; d = 3;