如何在运行时指定一个数组的一维尺寸?
我正在研究一种建立分布熵的函数。它使用copula(如果有的话)。我需要根据"关心的"维度来总结数组中的值。
示例:考虑以下示例...
Dimension 0 (across) _ _ _ _ _ _ _ _ _ _ _ _ _ |_ 0 _|_ 0 _|_ 0 _|_ 2 _| Dimension 1 |_ 1 _|_ 0 _|_ 2 _|_ 0 _| (down) |_ 0 _|_ 3 _|_ 0 _|_ 6 _| |_ 0 _|_ 0 _|_ 0 _|_ 0 _| I "care about" dimension 0 only, and "don't care" about the rest (dim 1). Summing this array with the above specifications will "collapse" the "stacks" of dimension 1 down to a single 4 x 1 array: _ _ _ _ _ _ _ _ _ _ _ _ _ |_ 1 _|_ 3 _|_ 2 _|_ 8 _| This can then be summed, or have any operation performed.
我需要使用" n"个维数组来完成此操作,该维的大小可能为20。此外,我需要能够执行此操作,关心某些维,然后折叠其余的维。我对此特别困难,因为我无法可视化20维:p。如果有人可以帮助我设置一些c / c ++代码来折叠/求和,我将非常感谢。
更新:
刚到家。这是一些信息回答问题:
- 抱歉,无法回滚编辑,我希望当我单击"回滚"时,它将向我显示所做的更改,以便我可以看到混乱的内容,有点像Wikipedia。我发现情况并非如此。
- @jeff-没有什么意义?我之所以使用这项出色的服务是出于合法的理由。我想在自己的业余爱好中变得更好,这就是我在读高中时的全部。我的许多帖子都涉及实现遗传算法(这篇文章,sparsearray,排列数组,指针操作)。
- 我使用的是稀疏数组表示形式,因为使用传统的(密集)数组有可能超过宇宙中的分子数量。目前,sparsearray本身的实现并不重要,因为在进行稀疏表示之前,我正在努力使其与标准数组一起使用。对于那些没有看过我以前的问题的人,我将使用二叉搜索树作为包含稀疏数组点的结构,并使用"驱动程序"函数根据需要遍历该树,并返回设计要执行的功能。这是灵活的,因此我可以适应许多不同的访问数组的方法。
- 该结构是一个超多维数据集,并且在运行时指定了维数,以及每个维的长度(因为它是一个超多维数据集,所以都相同)。
谢谢大家的贡献。
解决方案
回答
实际上,通过折叠各个列,我们已经对它们进行了求和,因此对于示例而言,维度根本不重要。我错过了什么还是你呢?
回答
我认为最好的做法是两件事中的一项/两项:
- 如果设计过于复杂,请重新考虑设计,找到一种不太复杂的方法。
- 停止尝试可视化它。:P仅存储需要累加的有关尺寸,然后一次进行一个尺寸处理即可。一旦有了基本代码,就着眼于提高算法效率。
回答
我希望与众不同,总有另一种方式。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
而且,如果我们真的无法重构,则需要将问题分解为更小的部分。就像我说的,确定需要累加的维度,然后一次打一个。
另外,停止更改编辑内容,它们正在纠正拼写错误,它们正在尝试为我们提供帮助;)
回答
当我们说不知道有多少个维度时,我们究竟如何定义数据结构?
在某个时候,某人需要创建此数组,并且要做到这一点,他们需要知道数组的尺寸。我们可以强制创建者将数据与数组一起传递。
除非问题是要定义这样的数据结构...
回答
我们正在c / c ++中执行此操作...因此我们拥有一个由array组成的array ...我们无需可视化20个维度,因为这不是将数据布置在内存中的方式,对于2尺寸:
[1] --> [1,2,3,4,5,6,...] [2] --> [1,2,3,4,5,6,...] [3] --> [1,2,3,4,5,6,...] [4] --> [1,2,3,4,5,6,...] [5] --> [1,2,3,4,5,6,...] . . . . . .
那么,为什么不能遍历第一个累加的内容呢?如果我们试图找到大小,那么sizeof(array)/ sizeof(int)
是一种冒险的方法。我们必须知道能够处理此数据的维,并设置内存,以便知道求和的递归深度。这是我们应该执行的操作的伪代码,
sum( n_matrix, depth ) running_total = 0 if depth = 0 then foreach element in the array running_total += elm else foreach element in the array running_total += sum( elm , depth-1 ) return running_total
回答
@杰夫
我实际上认为这是一个有趣的问题。我不确定它有多有用,但这是一个有效的问题。
@爱德
我们可以提供更多有关此问题的信息吗?我们说数组的维度是动态的,但是元素的数量也是动态的吗?
编辑:无论如何,我将尽力回答这个问题。我无法把代码放在脑海中(在此PC上没有任何编译器的情况下,可能需要一段时间才能正确完成),但是我可以为我们指明正确的方向...
让我们以索引为0到3的8个维度(0-7)为例。我们只关心1,2和6. 这意味着我们有两个数组。首先,分别为1,2和6的" array_care [4] [4] [4]"。" array_care [4] [4] [4]"将保存最终结果。
接下来,我们要以一种非常特定的方式进行迭代。我们有数组input [4] [4] [4] [4] [4] [4] [4] [4] [4]
可以解析,并且我们关心尺寸1、2和6.
我们需要定义一些临时索引:
int dim[8] = {0,0,0,0,0,0,0,0};
我们还需要存储要增加索引的顺序:
int increase_index_order[8] = {7,5,4,3,0,6,2,1}; int i = 0;
此订单对于完成要求很重要。
定义终止标志:
bool terminate=false;
现在我们可以创建循环:
while (terminate) { array_care[dim[1]][dim[2]][dim[6]] += input[dim[0]][dim[1]][dim[2]][dim[3]][dim[4]][dim[5]][dim[6]][dim[7]]; while ((dim[increase_index_order[i]] = 3) && (i < 8)) { dim[increase_index_order[i]]=0; i++; } if (i < 8) { dim[increase_index_order[i]]++; i=0; } else { terminate=true; } }
这应该适用于8个维度,大约需要3个维度。要使其动态,需要花费更多时间,而我没有时间。希望这可以帮助。我很抱歉,但是我还没有学习代码标记。 :(
回答
x = number_of_dimensions; while (x > 1) { switch (x) { case 20: reduce20DimensionArray(); x--; break; case 19: ..... } }
(抱歉,无法抗拒。)
回答
如果我理解正确,则希望对沿1维在每个" bin"处定义的横截面中的所有值求和。我建议为目标创建一个一维数组,然后遍历数组中的每个元素,将值添加到目标,并带有感兴趣维的索引。
如果我们使用任意数量的尺寸,则必须有一种寻址元素的方式(我很好奇我们是如何实现的)。实现将影响我们设置目标索引的方式。但是一个明显的方法是在迭代循环中检查if语句。
回答
如果使用STL容器或者Boost.MultiArray,则这种事情要容易得多。但是,如果必须使用数组:
#include <iostream> #include <boost/foreach.hpp> #include <vector> int sum(int x) { return x; } template <class T, unsigned N> int sum(const T (&x)[N]) { int r = 0; for(int i = 0; i < N; ++i) { r += sum(x[i]); } return r; } template <class T, unsigned N> std::vector<int> reduce(const T (&x)[N]) { std::vector<int> result; for(int i = 0; i < N; ++i) { result.push_back(sum(x[i])); } return result; } int main() { int x[][2][2] = { { { 1, 2 }, { 3, 4 } }, { { 5, 6 }, { 7, 8 } } }; BOOST_FOREACH(int v, reduce(x)) { std::cout<<v<<"\n"; } }
回答
这可能会有应用程序。假设我们实施了2D Conway的"生命游戏"(定义了2D平面," 1"表示"活动",0表示"死亡"),并且存储了每次迭代的游戏历史记录(然后定义了3D立方体)。如果我们想知道历史上还活着多少细菌,则可以使用上述算法。我们可以对3D(和4D,5D等)版本的"生命游戏"网格使用相同的算法。
我会说这是递归问题,我还不是C程序员,但我知道在C语言中是可能的。在python中,
def iter_arr(array): sum = 0 for i in array: if type(i) == type(list()): sum = sum + iter_arr(i) else: sum = sum + i return sum
- 遍历数组中的每个元素
- 如果element是另一个数组,请再次调用该函数
- 如果元素不是数组,则将其添加到总和中
- 返还金额
然后,我们可以将其应用于"关注"维度中的每个元素。
由于使用鸭式输入,这在python中更容易...