C++ 特征:块转置?

C++ 特征:块转置?,c++,eigen,eigen3,C++,Eigen,Eigen3,我不太清楚这个问题怎么表达 我有一个数据矩阵,看起来像这样 A = [ x(0,0) , ..., x(0,m-1) ] [ ... , ..., .... ] [ x(n-1,0), ..., x(n-1,m-1) ] 其中x本身就是一个大小为px1的向量。因此矩阵的大小为pn×m 我需要一个矩阵的参考 B = [ x(0,0) , ..., x(n-1,0) ] [ ... , ..., .... ] [

我不太清楚这个问题怎么表达

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

A = [  x(0,0) , ...,  x(0,m-1)  ]
    [    ...  , ...,     ....   ]
    [ x(n-1,0), ..., x(n-1,m-1) ]
其中
x
本身就是一个大小为
px1
的向量。因此矩阵的大小为pn×m

我需要一个矩阵的参考

B = [  x(0,0) , ...,  x(n-1,0)  ]
    [    ...  , ...,     ....   ]
    [ x(0,m-1), ..., x(n-1,m-1) ]
如果将
x
转置到上述等式中,那么显然,我们会得到
B=A^T
,但事实并非如此。因此,我不清楚如何创建上述矩阵

此外,如果我只需要矩阵
B
的副本,那么我可以使用一些
操作来构造它。不过,我需要一份推荐信。你知道我会怎么做吗

部分问题似乎在于:

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


我广泛使用
Map
函数进行重塑,但我不知道如何在这里实现这一点

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

因此,最简单的方法是使用
NullaryExpr
来转换所描述的行/列索引。在您的例子中,相应的nullary functor将实现如下内容:

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

但是,写访问将不可能。这是因为
NullaryExpr
不应该是可写的。它是为过程矩阵设计的,如零、一、标识、随机等。

p
在编译时确实是已知的。为什么写访问不可能?然后确保编译器知道这一点,编译器将为您进行优化;)