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

C++ 犰狳C++;:-高效访问多维数据集结构中的列,c++,matrix,armadillo,C++,Matrix,Armadillo,使用犰狳矩阵库,我知道访问2d矩阵中的列的有效方法是通过简单地调用.col(I) 我想知道是否有一种有效的方法可以提取存储在“多维数据集”中的列,而不必首先调用slice命令 我需要最有效的方法来访问存储在例如(使用matlab表示法)A(:,I,j)中的数据。我将在一个非常大的数据集上执行数百万次,因此速度和效率是一个高度优先事项。我想您需要 B = A.subcube( span:all, span(i), span(j) ); 或同等地 B = A.subcube( span(),

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

我想知道是否有一种有效的方法可以提取存储在“多维数据集”中的列,而不必首先调用slice命令

我需要最有效的方法来访问存储在例如(使用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类中:

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

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

我相信这会返回一个mat。理想情况下,我需要返回一个vec。对不起,我不小心,没有测试。这将返回一个vec,我经常使用它。您正在缩减为一列,因此矩阵实际上是一行或一列向量。我现在已经编辑了我的答案。谢谢。我会去尝试一下。看来使用subcube非常慢。我只是试着做一个立方体对一个std::vector,然后对元素执行一个所有对sq距离计算,向量方法花费了1/3的时间。我想有一种方法可以用它来把感冒弄出来用它???
F(0)(1,2);      // with range checks
F.at(0).at(1,2); // without range checks