【问题标题】:Accessing column slices of 2D valarrays访问 2D valarrays 的列切片
【发布时间】:2016-10-03 22:40:13
【问题描述】:

考虑下面的代码sn-p,

#include <iostream>
#include <valarray>

using namespace std;

std::ostream & operator<<(std::ostream & out, const std::valarray<int> inputVector);
typedef std::valarray<std::valarray<int> > val2d;

int main()
{
    val2d g(std::valarray<int>(10),4);

    for (uint32_t n=0; n<4; ++n){
        for (uint32_t m=0; m<10; ++m){
            g[n][m] = n*10 + m;
        }
    }  
   std::valarray<int> g_slice_rs = g[1][std::slice(0,10,1)];  // row slice
   //std::valarray<int> g_slice_cs = g[std::slice(0,1,3)][0];   // column slice (comment out)

   cout<<"row slice :: "<<g_slice_rs<<endl; 
   //cout<<"column slice :: "<<g_slice_cs<<endl; // (comment out)
   return 0;
}

std::ostream & operator<<(std::ostream & out, const std::valarray<int> inputVector)
{
  uint32_t vecLength = inputVector.size();
  out<<"[";
  for (uint32_t i=0; i<vecLength; ++i)
  {
    out <<inputVector[i]<<", ";
  }
  out<<"]"<<endl;
  return out;
}

在这里我可以访问行切片,但不能访问列切片(如 cmets 所示)。是否有任何解决方法来访问列切片? This 线程没有提供答案。

【问题讨论】:

    标签: c++ multidimensional-array valarray


    【解决方案1】:

    首先,您没有 2D valarray。你有一个valarrayvalarrays,这是你不应该忽视的区别。

    x = g[m][n];
    

    只是看起来像数组样式的访问。真的更接近了

    temp = g[m];
    x = temp[n];
    

    valarray 的数据存储区是一个不错的连续内存块,但如果您有一个 M×N 结构,则可能有 M+1 个valarrays 分散在整个内存中。这可能会变成一场噩梦,导致性能下降的缓存未命中。

    您将不得不决定哪一个更重要,即行切片还是列切片,因为只有一个会随着内存流而变化,而另一个则需要一个缓存颠簸副本。

    目前

    g[1][std::slice(0,10,1)];
    

    之所以有效,是因为它正在分割一个连续的内存块,并且

    g[std::slice(0,1,3)][0]
    

    失败,因为它必须跨越 M 个不同的 valarrays 才能收集切片,而 std::slice 不能这样做。您必须从组成该列的每个 valarrays 中手动复制所需的元素。糟透了,是吧?

    那你怎么办?

    你假的!哈哈哈哈哈哈哈!

    不要在valarrays 中创建valarray。制作一个大小为 MxN 的大 valarray。所以说再见

    std::valarray<std::valarray<int> > g(std::valarray<int>(10),4);
    

    你好

    std::valarray<int>(10*4);
    

    现在你可以利用std::slice的stride参数来抓取每十个元素

    std::slice(column_to_slice,4,10);
    

    作为额外的好处,您现在拥有一个连续的内存块,因此至少应该减轻一些缓存研磨滥用。如果步幅过大,你仍然是蓝精灵。

    我全心全意地建议将其包装在一个对象中,以使访问和管理更容易。 Something like this,除非您使用 valarray 而不是原始指针。

    【讨论】:

    • 我试图避免将其变成一维 valarray,但我想没有办法解决它。
    猜你喜欢
    • 2016-02-16
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多