Armadillo C ++: - 高效访问多维数据集结构中的列

时间:2012-04-22 17:56:51

标签: c++ matrix armadillo

使用Armadillo矩阵库我知道在2d矩阵中访问列的有效方法是通过简单地调用.col(i)。

我想知道是否有一种有效的方法来提取存储在“立方体”中的列,而无需先调用切片命令?

我需要以最有效的方式访问存储在其中的数据(使用matlab表示法)A(:,i,j)。我将在一个非常大的数据集上进行数百万次,因此速度和效率是一个高优先级。

2 个答案:

答案 0 :(得分:5)

我想你想要

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

或等效

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

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

答案 1 :(得分:1)

.slice()应该很快。它只是提供了对底层Mat类的引用。你可以尝试这些方面:

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

另外,请记住,Armadillo默认启用范围检查。如果要避免范围检查,请使用.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编译代码,这将删除所有运行时调试(例如范围检查)。这将为您提供加速,但只有在您调试了所有代码(即验证您的算法正常工作)后才建议使用。调试检查对于发现错误非常有用。