微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以更快地将我的1D向量转换为2D向量吗?

如何解决我可以更快地将我的1D向量转换为2D向量吗?

问题很简单。经过一番试验,这是我发现的最有效的代码

//For the sake of the example,I initialize every entry as zero.
vector<float> vector1D(1024 * 768,0); 
vector<vector<float>> vector2D(768,vector<float>(1024,0));

int counter = 0;
for (int i = 0; i < 768; i++) {
    for (int j = 0; j < 1024; j++) {
        vector2D[i][j] = vector1D[counter++];
    }
}

有更快的方法吗?

解决方法

是的

您可以重新映射访问元素的方式,而无需复制它们。您可以创建一个“视图”类来实现这一点:

template<typename T>
class two_dee_view
{
public:
    two_dee_view(std::vector<T>& v,std::size_t row,std::size_t col)
        : v(v),stride(col) { if(v.size() < row * col) v.resize(row * col); }

    T& operator()(std::size_t row,std::size_t col)
        { return v[(row * stride) + col]; }

    T const& operator()(std::size_t row,std::size_t col) const
        { return v[(row * stride) + col]; }

    std::size_t col_size() const { return stride; }
    std::size_t row_size() const { return v.size() / stride; }

private:
    std::vector<T>& v;
    std::size_t stride;
};

int main()
{
    std::vector<double> v {1.0,2.0,3.0,4.0,5.0,6.0};

    two_dee_view<double> v2d(v,2,3);

    for(auto row = 0U; row < v2d.row_size(); ++row)
        for(auto col = 0U; col < v2d.col_size(); ++col)
            std::cout << row << "," << col << ": " << v2d(row,col) << '\n';
}

输出:

0,0: 1
0,1: 2
0,2: 3
1,0: 4
1,1: 5
1,2: 6

该类仅维护对传递给构造函数std::vector引用。只要原始的two_dee_view可以使用,就只能使用std::vector,但是不再使用。

,

使用memcpy可能会更快,因为这是用于复制内存的API的最低级别,并且可能存在编译器优化可能使用特定的指令等,并且使速度更快:

for (int i = 0; i < 768; i++) {
    memcpy(vector2D[i].data(),&vector1D[i * 1024],sizeof(float) * 1024);
}

请记住,除了可复制的数据外,您不应该将memcpy用于任何其他用途。也就是说,它对于floatint来说可以正常工作,但对于类而言则不能,因为不会调用复制构造函数。

,

如果由于某些原因必须使用向量向量,则使用memcpymemmove会更快(因为这是一个步骤,如另一封回复所述)。但是您应该使用STL,而不要自己动手。

vector<float> vector1D(1024 * 768,0);
vector<vector<float>> vector2D(768,vector<float>(1024,0));

for (int i = 0; i < 768; i++) {
  vector2D[i].assign(next(vector1D.cbegin(),1024 * i),next(vector1D.cbegin(),1024 * (i + 1)));
}

这会产生一个直接的memmove(取决于STL的实现方式),但是更加安全,经过优化并且(可能)可读。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。