犰狳C++:- 有效访问立方体结构中的柱子

Armadillo C++:- Efficient access of columns in a cube structure

本文关键字:结构 立方体 访问 C++ 有效 犰狳      更新时间:2023-10-16

使用犰狳矩阵库,我知道访问二维矩阵中的列的有效方法是通过简单地调用.col(i)。

我想知道是否有一种有效的方法来提取存储在"多维数据集"中的列,而无需首先调用切片命令?

我需要最有效的方法来访问存储在中的数据,例如(使用 matlab 符号)A(:,i,j)。我将在一个非常大的数据集上做数百万次,所以速度和效率是重中之重。

我想你想要

 B = A.subcube( span:all, span(i), span(j) );

或等效

 B = A.subcube( span(),  span(i),  span(j) );

其中B将是与A类型相同的行或列向量(例如,默认包含double,或许多其他可用类型)。

.slice() 应该很快。它只是提供对基础 Mat 类的引用。您可以尝试以下操作:

cube C(4,3,2);
double* mem = C.slice(1).colptr(2);

另外,请记住,犰狳默认启用范围检查。 如果要避免范围检查,请使用 .at() 元素访问器:

cube C(4,3,2);
C.at(3,2,1) = 456;

或者,您可以将矩阵存储在字段类中:

field<mat> F(100);
F(0).ones(12,34);

对应的元素访问:

F(0)(1,2);      // with range checks
F.at(0).at(1,2); // without range checks

您还可以使用定义的ARMA_NO_DEBUG编译代码,这将删除所有运行时调试(例如范围检查)。这将给你一个加速,但只有在你调试了所有代码(即验证你的算法是否正常工作)之后,才建议这样做。调试检查在发现错误时非常有用。