特征:块转置?

时间:2018-03-08 09:04:41

标签: c++ eigen eigen3

我不确定如何说出这个问题...

我有一个看起来像这样的数据矩阵

A = [  x(0,0) , ...,  x(0,m-1)  ]
    [    ...  , ...,     ....   ]
    [ x(n-1,0), ..., x(n-1,m-1) ]

其中x本身就是一个大小为p x 1的向量。所以矩阵的大小为pn x m

我需要对矩阵的引用

B = [  x(0,0) , ...,  x(n-1,0)  ]
    [    ...  , ...,     ....   ]
    [ x(0,m-1), ..., x(n-1,m-1) ]

如果x被转换为上述等式,那么显然,我们会得到B = A^T,但事实并非如此。所以目前还不清楚如何创建上述矩阵。

此外,如果我只需要矩阵B的副本,那么我可以使用一些block操作来构造它。但是,我需要一个参考。知道我该怎么做吗?

部分问题似乎是:

如果A中的数据存储在连续内存中,则B中的引用将以非连续方式引用数据。例如,我认为你不能使用步幅构建B

我广泛使用Map函数进行重新整形,但我在这里看不到如何做到这一点。

1 个答案:

答案 0 :(得分:1)

这是可能的,但代价是昂贵的整数除法和模数(如果在编译时已知p,则可以优化这些)。

最简单的方法是使用NullaryExpr转换行/列索引,如there所述。在你的情况下,相应的nullary仿函数将实现如下:

const typename ArgType::Scalar& operator() (Index row, Index col) const {
  return m_arg(col/p, row*p + col%p);
}

然而,写访问权限是不可能的。这是因为NullaryExpr不应该是可写的。它专为程序矩阵设计,如Zero,Ones,Identity,Random等。