使用Armadillo矩阵库我知道在2d矩阵中访问列的有效方法是通过简单地调用.col(i)。
我想知道是否有一种有效的方法来提取存储在“立方体”中的列,而无需先调用切片命令?
我需要以最有效的方式访问存储在其中的数据(使用matlab表示法)A(:,i,j)。我将在一个非常大的数据集上进行数百万次,因此速度和效率是一个高优先级。
答案 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编译代码,这将删除所有运行时调试(例如范围检查)。这将为您提供加速,但只有在您调试了所有代码(即验证您的算法正常工作)后才建议使用。调试检查对于发现错误非常有用。