我感兴趣的是使用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
}
? 请注意,置换顺序是函数的输入。 谢谢,
答案 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?的这个很好说明的答案,正如那里所解释的那样,通过这种方案,张量值甚至不需要为转置操作复制。