gpt4 book ai didi

c - 置换 C 中的 d 维张量

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:56 27 4
gpt4 key购买 nike

我对使用 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
}

?请注意,排列顺序是函数的输入。谢谢,

最佳答案

编辑: 看来我误解了这个问题。但是下面的答案仍然与主题相关,所以我暂时不打算删除它。

答案可能是特定于问题的,也许用于排列 d == 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 维指针的最佳方法。但是,您可以使用一维数组和一些数学来模拟 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;

关于c - 置换 C 中的 d 维张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com