在班级中使用犰狳矩阵

时间:2014-02-25 04:32:14

标签: c++ matrix armadillo

我是一名物理学家,在课程编程方面经验不足。如果有人可以帮助我,我将不胜感激。我已经在python类中成功使用了numpy数组,但在这里丢失了。

动机很简单。我需要使用一个带有几个矩阵的类作为私有成员,并对它们执行一些操作。请看以下内容。

#include<iostream>
#include<armadillo>

using namespace std;

class myclass{
    // a matrix
    double A[2][2];
public:
    int set_element(double);
};

int main(){
    myclass x;
    x.set_element(2.0);
}

int myclass::set_element(double num){
    // a function to assign a value to the first array element.
    A[0][0] = num;
    cout << A[0][0] << endl;
    return 0;
}

这会编译并正确运行。但是,如果我尝试使用犰狳矩阵,事情就不起作用了。

#include<iostream>
#include<armadillo>

using namespace std;
using namespace arma;

class myclass{
private:
    // a matrix
    mat A(2,2);
public:
    int set_element(double);
};

int main(){
    myclass x;
    x.set_element(2.0);
}

int myclass::set_element(double num){
    //function to set the first element.
    A(0,0) = num;
    cout << A(0,0) << endl;
    return 0;
}

当我尝试编译时,我得到一堆或错误。

jayasurya@yvjs:~/comp/cpp$ g++ dummy.cpp -larmadillo
dummy.cpp:10:15: error: expected identifier before numeric constant
dummy.cpp:10:15: error: expected ‘,’ or ‘...’ before numeric constant
dummy.cpp: In member function ‘int myclass::set_element(double)’:
dummy.cpp:22:14: error: no matching function for call to ‘myclass::A(int, int)’
dummy.cpp:22:14: note: candidate is:
dummy.cpp:10:13: note: arma::mat myclass::A(int)
dummy.cpp:10:13: note:   candidate expects 1 argument, 2 provided
dummy.cpp:23:22: error: no matching function for call to ‘myclass::A(int, int)’
dummy.cpp:23:22: note: candidate is:
dummy.cpp:10:13: note: arma::mat myclass::A(int)
dummy.cpp:10:13: note:   candidate expects 1 argument, 2 provided

我确信我在这里缺少一些关键方面;有人请指出来。

感谢!

2 个答案:

答案 0 :(得分:5)

你需要在类体中声明你的armadillo矩阵,并在以后初始化它,例如在你的类构造函数中。由于犰狳矩阵没有编译时大小,因此矩阵的大小属于对象构造,而不是其定义。

class myclass{
private:
    // a matrix - DECLARATION of a member variable
    mat A;
public:
    myclass() // Constructor
    : A(2, 2) { // Default matrix member variable initialization
    }

    // another constructor where you can supply other dimensions:
    myclass(int rows, int cols)
    : A(rows, cols) { // matrix member variable initialization
    } 

    int set_element(double);
};

一旦你理解了这一点,就会有一些C ++ 11语法更改允许你更优雅地编写默认的构造案例,语法接近你想要的语法:

class myclass {
private:
    // a matrix - this syntax allows you to specify the default initialization parameters for this variable
    mat A {2, 2}; 
public:
    int set_element(double);
};

或者,您可以使用编译时固定大小的矩阵,如下面的mtall所示,这使您无需在初始化时设置大小:

class myclass {
private:
    // a matrix - this syntax allows you to specify a compile-time size
    mat::fixed<2, 2> A; 
public:
    int set_element(double);
};

答案 1 :(得分:1)

您可以使用Martin J.的代码,该代码使用动态大小的矩阵,或者下面的代码使用固定大小的矩阵。

使用固定大小的矩阵有利有弊。一方面,固定大小可以让智能C ++编译器(例如gcc)进行更多优化。另一方面,矩阵大小不能改变,优化的收益仅对小矩阵有用。使用大的固定大小的矩阵(即大于10x10或100个元素)也会占用堆栈内存。

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

class myclass{
private:
   // a fixed-size matrix: allows more optimization
   // (generally recommended only for sizes <= 10x10)
   mat::fixed<2,2> A;
public:
   int set_element(double);
};

int main(){
  myclass x;
  x.set_element(2.0);
}

int myclass::set_element(double num){
  //function to set the first element.
  A(0,0) = num;
  cout << A(0,0) << endl;
  return 0;
}