特征:块转置

Eigen: Block transpose?

本文关键字:转置 特征      更新时间:2023-10-16

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

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

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来转换行/列索引,如此处所述。在您的情况下,相应的空函子将实现如下内容:

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

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