自己:块转置?

Eigen: Block transpose?

我不太确定如何表述这个问题...

我有一个数据矩阵,如下所示

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 函数进行重塑,但我只是不知道如何在此处执行此操作。

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

所以最简单的方法是使用 NullaryExpr 来转换 row/column 索引,如 there 所述。在您的情况下,相应的 nullary 仿函数将实现如下内容:

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

但是,将无法进行写访问。这是因为 NullaryExpr 不应该是可写的。它专为零、一、同一、随机等程序矩阵而设计。