使用犰狳做 `Q.slice(a).col(b)` 的更有效方法

Posted

技术标签:

【中文标题】使用犰狳做 `Q.slice(a).col(b)` 的更有效方法【英文标题】:More efficient way to do `Q.slice(a).col(b)` using Armadillo 【发布时间】:2020-03-15 19:05:39 【问题描述】:

有没有比 Q.slice(a).col(b) 更有效的方法从犰狳的立方体中提取一列?

类似于tube,但用于最后 2 个维度而不是前 2 个维度。

【问题讨论】:

【参考方案1】:

获取指向所需切片的所需列的第一个元素的指针。然后将该指针传递给vec class 的高级构造函数之一。 示例:

cube C(6, 5, 4, fill::randu); // cube with 4 slices

vec v1 = C.slice(2).col(3);  // normal way of extracting a vector

vec v2( &C(0,3,2), C.n_rows, false, false);  // alternative way

请注意,虽然这可行,但并不安全。如果C 被调整大小或被删除,v2 将使用未分配的内存,或来自不同对象的内存。在第一种情况下,它可能会导致段错误。第二种情况是信息泄露。

如果Cconst cube,则使用const_cast 从获得的指针中剥离const。同样,这也不安全。

【讨论】:

谢谢,创意!问题:如果我仍然需要副本,使用vec v2( &C(0,3,2), C.n_rows, true, true)(强制复制)有什么好处吗?在使用 openMP 的应用程序中,这将如何比较?

以上是关于使用犰狳做 `Q.slice(a).col(b)` 的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将值附加到犰狳矩阵?

当 B 是犰狳中的对称矩阵时的 A * B 计算

相当于 A(find(A<0)) = 0 的犰狳

犰狳的求解(A,b)从 Matlab,Eigen 返回不同的答案

C ++犰狳 - 为列赋值

犰狳 C++ LU 分解