繁体   English   中英

创建一个 3D 向量。 C++

[英]Creating a 3D vector. C++

请帮帮我。 我有一个 3d 向量。 我需要使用现有的内部索引从中创建一个新向量。 希望输入和output信息清楚。

输入:

    a = {
        { {1,1,1,1}, {2,2,2,2}, {3,3,3,3}, {4,4,4,4}, {5,5,5,5}, {6,6,6,6} },
        { {10,10,10,10}, {20,20,20,20}, {30,30,30,30}, {40,40,40,40}, {50,50,50,50}, {60,60,60,60} },
        { {100,100,100,100}, {200,200,200,200}, {300,300,300,300}, {400,400,400,400}, {500,500,500,500}, {600,600,600,600} },
    };

Output:

    b = {
        {{ 1,1,1,1}, {10,10,10,10}, {100,100,100,100}},
        {{ 2,2,2,2}, {20,20,20,20}, {200,200,200,200}},
        {{ 3,3,3,3}, {30,30,30,30}, {300,300,300,300}},
        {{ 4,4,4,4}, {40,40,40,40}, {400,400,400,400}},
        {{ 5,5,5,5}, {50,50,50,50}, {500,500,500,500}},
        {{ 6,6,6,6}, {60,60,60,60}, {600,600,600,600}},
    }

我不知道如何迭代 3D 数组中的索引以创建新的 3D 数组(输出)。 我想从现有 3D 向量的列(n 索引)创建一个 3D 向量。 我有一个 3D 向量(“输入”)。 我需要从中制作一个 3D 向量(“输出”)。

#include <iostream>
#include <vector>

using namespace std;

void show3D_vector(std::vector<std::vector<std::vector<double>>>& a);
void show2D_vector(std::vector<std::vector<double>>& a);
template<typename T> std::vector<std::vector<T>> SplitVector(const std::vector<T>& vec, size_t n);


int main()
{
    
        a = {
        { {1,1,1,1}, {2,2,2,2}, {3,3,3,3}, {4,4,4,4}, {5,5,5,5}, {6,6,6,6} },
        { {10,10,10,10}, {20,20,20,20}, {30,30,30,30}, {40,40,40,40}, {50,50,50,50}, {60,60,60,60} },
        { {100,100,100,100}, {200,200,200,200}, {300,300,300,300}, {400,400,400,400}, {500,500,500,500}, {600,600,600,600} },
    }; 


}


void show3D_vector(std::vector<std::vector<std::vector<double>>>& a)
{
    for (double i = 0; i < a.size(); ++i)
    {
        for (double j = 0; j < a[i].size(); ++j)
        {
            for (double k = 0; k < a[i][j].size(); ++k)
                std::cout << a[i][j][k] << "  ";
            std::cout << endl;
        }
        std::cout << endl;
    }
}

void show2D_vector(std::vector<std::vector<double>>& a)
{
    for (int i = 0; i < a.size(); i++) {
        for (auto it = a[i].begin(); it != a[i].end(); it++)
        {
            std::cout << *it << " ";
        }

        std::cout << endl << endl;
    }
}

template<typename T>
std::vector<std::vector<T>> SplitVector(const std::vector<T>& vec, size_t n)
{
    std::vector<std::vector<T>> outVec;

    size_t length = vec.size() / n;
    size_t remain = vec.size() % n;

    size_t begin = 0;
    size_t end = 0;

    for (size_t i = 0; i < std::min(n, vec.size()); ++i)
    {
        end += (remain > 0) ? (length + !!(remain--)) : length;
        outVec.push_back(std::vector<T>(vec.begin() + begin, vec.begin() + end));
        begin = end;
    }

    return outVec;
}

谢谢你。

您可以更简洁地求解此矩阵转置。

    for(const auto& a1 : a){
        b.resize(a1.size());
        auto b1 = b.begin();
        for(const auto& a2 : a1){
            b1->push_back(a2);
            b1++;
        }
    }

output 是

{{1,1,1,1,},{10,10,10,10,},{100,100,100,100,},},
{{2,2,2,2,},{20,20,20,20,},{200,200,200,200,},},
{{3,3,3,3,},{30,30,30,30,},{300,300,300,300,},},
{{4,4,4,4,},{40,40,40,40,},{400,400,400,400,},},
{{5,5,5,5,},{50,50,50,50,},{500,500,500,500,},},
{{6,6,6,6,},{60,60,60,60,},{600,600,600,600,},},

鉴于您的输入和您发布的示例中的 output ,它似乎只是数据的转置,其中n无关紧要。

如果是这种情况,以下代码将执行此操作:

#include <vector>
#include <iostream>

void show3D_vector(std::vector<std::vector<std::vector<double>>>& a)
{
    for (size_t i = 0; i < a.size(); ++i)
    {
        for (size_t j = 0; j < a[i].size(); ++j)
        {
            std::cout << "{";
            for (size_t k = 0; k < a[i][j].size(); ++k)
            {
                if (k > 0)
                    std::cout << ",";
                std::cout << a[i][j][k];
            }
            std::cout << "} ";
        }
        std::cout << std::endl;
    }
}

template<typename T>
std::vector<std::vector<std::vector<T>>> Transpose(const std::vector<std::vector<std::vector<T>>>& vec)
{
    if (vec.empty())
        return {};

    // Construct the output vector
    std::vector<std::vector<std::vector<T>>> 
         outVect(vec[0].size(), 
         std::vector<std::vector<T>>(vec.size()));

    // transpose loop
    for (size_t row = 0; row < vec.size(); ++row)
    {
        for (size_t col = 0; col < vec[0].size(); ++col)
            outVect[col][row] = vec[row][col];
    }
    return outVect;
}

int main()
{
    std::vector<std::vector<std::vector<double>>> a = 
    {
        { {1,1,1,1}, {2,2,2,2}, {3,3,3,3}, {4,4,4,4}, {5,5,5,5}, {6,6,6,6} },
        { {10,10,10,10}, {20,20,20,20}, {30,30,30,30}, {40,40,40,40}, {50,50,50,50}, {60,60,60,60} },
        { {100,100,100,100}, {200,200,200,200}, {300,300,300,300}, {400,400,400,400}, {500,500,500,500}, {600,600,600,600} },
    };

    auto b = Transpose(a);
    show3D_vector(b);
}

Output:

{1,1,1,1} {10,10,10,10} {100,100,100,100} 
{2,2,2,2} {20,20,20,20} {200,200,200,200} 
{3,3,3,3} {30,30,30,30} {300,300,300,300} 
{4,4,4,4} {40,40,40,40} {400,400,400,400} 
{5,5,5,5} {50,50,50,50} {500,500,500,500} 
{6,6,6,6} {60,60,60,60} {600,600,600,600} 

另一个问题是您的show3d_vector function 使用了不正确的for循环计数器类型。 它应该是size_t ,而不是double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM