在armadillo中,高级构造函数提供了共享内存的方式,如
mat B(10,10);
mat A(B.memptr(),2,50,false, true);
但是在关于类的c ++程序中,首先应该在头文件中声明变量,比如
mat A,B;
并在cpp文件中实现其他功能。
那么,任何人都可以告诉我如何在cpp文件中的mat A和mat B之间共享内存,并在头文件中声明mat A和B?
答案 0 :(得分:1)
您可以在声明课程时将B
矩阵声明为A
矩阵的参考。例如:
class foo
{
public:
mat A;
mat& B; // alias of A
foo()
: B(A) // need to initialize the reference as part of the constructor
{
A.zeros(4,5);
A(1,1) = 1;
B(2,2) = 2;
A.print("A:");
B.print("B:");
}
};
另一个(更脆弱的)解决方案是使用公共矩阵,然后使用C ++ 11 std::move()将内存分配给其他矩阵。例如:
#include <utility>
#include <armadillo>
using namespace std;
using namespace arma;
int main()
{
mat C(4,5, fill::zeros); // C is the common matrix
mat A:
mat B;
A = std::move( mat(C.memptr(), C.n_rows, C.n_cols, false, false) );
B = std::move( mat(C.memptr(), C.n_rows, C.n_cols, false, false) );
// note: in the above, the last argument of 'false' is important
A(1,1) = 1;
B(2,2) = 2;
// A and B will both have 1 and 2 as they're using the same memory
A.print("A:");
B.print("B:");
}
如果您正在使用gcc或clang,则可以使用-std=c++11
开关启用C ++ 11模式。
答案 1 :(得分:0)
在 vs 2013 ,
中#define ARMA_USE_CXX11
应该包括。然后 std :: move 就可以了。
感谢 hbrerkere 指导正确的方式。