4

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

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

我需要最有效的方式来访问存储在例如 A(:,i,j) 中的数据(使用 matlab 表示法)。我将在一个非常大的数据集上执行数百万次此操作,因此速度和效率是重中之重。

4

2 回答 2

5

我想你想要

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

或等效地

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

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

于 2012-04-22T18:06:18.640 回答
1

.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 编译代码,这将删除所有运行时调试(例如范围检查)。这将加快您的速度,但仅在您调试完所有代码后才建议您这样做(即验证您的算法是否正常工作)。调试检查对于发现错误非常有用。

于 2012-05-18T05:17:31.933 回答