我不确定如何表达这个问题...
我有一个看起来像这样的数据矩阵
A = [ x(0,0) , ..., x(0,m-1) ]
[ ... , ..., .... ]
[ x(n-1,0), ..., x(n-1,m-1) ]
其中
x
本身是p x 1
大小的 vector 。因此,矩阵的大小为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
转换there所述的行/列索引。在您的情况下,各个无效函子将实现以下内容:
const typename ArgType::Scalar& operator() (Index row, Index col) const {
return m_arg(col/p, row*p + col%p);
}
但是,将无法进行写访问。这是因为
NullaryExpr
不应写。它被设计用于过程矩阵,例如零,一个,同一性,随机等。