自己:块转置?
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
不应该是可写的。它专为零、一、同一、随机等程序矩阵而设计。
我不太确定如何表述这个问题...
我有一个数据矩阵,如下所示
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
不应该是可写的。它专为零、一、同一、随机等程序矩阵而设计。