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