C++ 在C+中具有可变维数的N维矩阵上迭代+;

C++ 在C+中具有可变维数的N维矩阵上迭代+;,c++,algorithm,recursion,C++,Algorithm,Recursion,我试图迭代一个n维矩阵,其中矩阵的每个维度也有一个可变的大小 我特别希望每个元素都有多维坐标,比如for循环提供I来访问数组中的元素 我想基本上重新创建一个嵌套的for循环,就像下面的递归代码一样,我可以将任何不同类型的数字放入dimensionSize std::vector dimensionSize={1,4,4}; 对于(int i=0;i

我试图迭代一个n维矩阵,其中矩阵的每个维度也有一个可变的大小

我特别希望每个元素都有多维坐标,比如
for循环
提供
I
来访问数组中的元素

我想基本上重新创建一个嵌套的for循环,就像下面的递归代码一样,我可以将任何不同类型的数字放入
dimensionSize

std::vector dimensionSize={1,4,4};
对于(int i=0;istd::cout如果我理解正确,您希望迭代“n维矩阵”(实际上不称为“矩阵”)的所有元素,并需要一种获取所有索引的方法。我将从以下内容开始:

#include <iostream>
#include <vector>

struct multi_index {
    std::vector<size_t> dimensions;
    std::vector<size_t> current;
    multi_index(std::vector<size_t> dim) : dimensions(dim), current(dim.size()) {}
    void print() {
        for (const auto& e : current) std::cout << e << " ";
        std::cout << "\n";
    }
    bool increment() {        
        for (size_t i=0;i<dimensions.size();++i) {
            current[i] += 1;
            if (current[i] >= dimensions[i]) {
                current[i] = 0;
            } else {
                return true;
            }
        }
        return false;
    }
};


int main() {
    multi_index x{{1,2,3}};
    do {
        x.print();
    } while (x.increment());    
}
一旦将多维数据存储在平面数组/向量中,编写一个简单的循环来迭代所有元素就应该很简单了


PS:老实说,我没有费心在你的代码中找到问题,递归让我头晕目眩:p

我不确定我是否理解这个问题。如果你想访问多维数组的每个元素一次,下面的代码应该可以完成这项工作(在我的例子中,计数器计算访问每个元素的次数,因此,在结束计数时,应等于维度大小):

void打印计数器(标准::向量和计数器)
{
for(无符号整数i=0;istd::cout Note它叫维度而不是维度。它必须是递归的吗?拼写已经纠正了!不,它不必是递归的,但我找不到一个清晰的非递归修复的例子。试着将它展平到一个维度。使大多数内容更简单。@skeller矩阵是一个非常笨拙的字节数组,每个维度都有自己的位步长.我正试图将其复制到一个特征矩阵,你是对的,它可以被展平。工作起来很有魅力!非常感谢!递归太可怕了。我将把你的代码添加到我的帖子:)@parkywolfy不添加页面上已有的代码。接受答案是堆栈溢出的工作方式。当我们看到绿色复选标记时,我们知道是您接受了此答案。@perkywolfy yes,“将您的代码添加到我的帖子”如果你是指你的问题,那么请不要这样做。问题是针对问题的,提问者是针对答案的。你的问题很好,如果你将此代码添加到你的问题中,这将是一个糟糕的问题,我的答案将是错误的superfluous@parkywolfy严格地说,矩阵有两个维度。一个维度更多的结构更愿意被称为矩阵d张量,它是矩阵概念到n的推广dimensions@parkywolfy我觉得答案中缺少了一些东西,我添加了一些关于如何使多维变平的内容。顺便说一句,我警告过你;)看到
{
在下一行,所以我真的不想接受你的编辑。我的意思是这是一个品味问题,但肯定不是我的问题。这并不能解决我的问题,因为我想访问每个元素一次,而不仅仅是“计算每个元素被访问的次数”。我也不能使用您的算法的输出,因为当我想使用计数器作为坐标访问每个元素时,它超出了维度的范围。它将只访问每个元素一次,如果不访问,则计数器艺术末端应具有不同的值。此答案甚至不会访问每个元素一次,请查看您的输出。算法应该生成以{0,0,0}开始并以{0,3,3}结束的每个数字排列。好的,我还没有完全理解你的问题
0 1 0 
0 2 0 
0 3 0 
#include <iostream>
#include <vector>

struct multi_index {
    std::vector<size_t> dimensions;
    std::vector<size_t> current;
    multi_index(std::vector<size_t> dim) : dimensions(dim), current(dim.size()) {}
    void print() {
        for (const auto& e : current) std::cout << e << " ";
        std::cout << "\n";
    }
    bool increment() {        
        for (size_t i=0;i<dimensions.size();++i) {
            current[i] += 1;
            if (current[i] >= dimensions[i]) {
                current[i] = 0;
            } else {
                return true;
            }
        }
        return false;
    }
};


int main() {
    multi_index x{{1,2,3}};
    do {
        x.print();
    } while (x.increment());    
}
#include <vector>
#include <utility>
template <typename T>
struct multi_dim_array {
    std::vector<T> data;
    std::vector<size_t> dimensions;
    multi_dim_array(std::vector<size_t> dim) {
        size_t total = 1;
        for (const auto& d : dim) total *= d;
        data.resize(total);
    }
    T& get(std::initializer_list<int> index) {
        return data[flatten_index(index)];
    }
    size_t flatten_index(std::initializer_list<int> index) {
        size_t flat = 0;
        size_t sub_size = 1;
        for (auto x = std::make_pair(0u,index.begin());
             x.first < dimensions.size() && x.second != index.end();
             ++x.first, ++x.second) {
            flat += (*x.second) * sub_size;
            sub_size *= dimensions[x.first];
        }
        return flat;
    }
};
int main(){
    multi_dim_array<int> x{{2,2,3}};
    x.get({1,1,1}) = 5;
}
1 0 0
1 1 0
1 2 0
1 3 0
1 4 0
1 4 1
1 4 2
1 4 3
1 4 4