制作类的Boost Matrix属性

时间:2015-06-23 01:34:55

标签: c++ boost

我想将Boost Matrix作为我的班级Adsorbate的属性。我事先知道它会是(3,2)。我想这样做:

#include <boost/numeric/ublas/matrix.hpp>
using namespace boost::numeric::ublas;

class Adsorbate {
    matrix<double> m(3,2);
};

以便编译器知道属性m的大小,从而知道我的类Adsorbate。这样,我可以创建一个200个指针数组:

 Adsorbate * adsorbates = (Adsorbate *) malloc(200 * sizeof(Adsorbate));

我该怎么做?

2 个答案:

答案 0 :(得分:2)

只需在构造函数中初始化它:

mediaResponse, err := api.UploadMedia("R0lGODlhEAALALMMAOXp8a2503CHtOrt9L3G2+Dl7vL0+J6sy4yew1Jvp/T2+e/y9v///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCwAMACwAAAAAEAALAAAEK5DJSau91KxlpObepinKIi2kyaAlq7pnCq9p3NZ0aW/47H4dBjAEwhiPlAgAIfkECQsADAAsAAAAAAQACwAABA9QpCQRmhbflPnu4HdJVAQAIfkECQsADAAsAAAAABAACwAABDKQySlSEnOGc4JMCJJk0kEQxxeOpImqIsm4KQPG7VnfbEbDvcnPtpINebJNByiTVS6yCAAh+QQJCwAMACwAAAAAEAALAAAEPpDJSaVISVQWzglSgiAJUBSAdBDEEY5JMQyFyrqMSMq03b67WY2x+uVgvGERp4sJfUyYCQUFJjadj3WzuWQiACH5BAkLAAwALAAAAAAQAAsAAAQ9kMlJq73hnGDWMhJQFIB0EMSxKMoiFcNQmKjKugws0+navrEZ49S7AXfDmg+nExIPnU9oVEqmLpXMBouNAAAh+QQFCwAMACwAAAAAEAALAAAEM5DJSau91KxlpOYSUBTAoiiLZKJSMQzFmjJy+8bnXDMuvO89HIuWs8E+HQYyNAJgntBKBAAh+QQFFAAMACwMAAIABAAHAAAEDNCsJZWaFt+V+ZVUBAA7")
if err != nil {
    fmt.Println(err)
}

//v := url.Values{}
//v.Set("media_ids", string(mediaResponse.MediaID))
fmt.Println(mediaResponse)
tweet := `
"media_ids": 612877656984416256,
"status": "hello"
`

result, err := api.PostTweet(tweet, nil)
if err != nil {
    fmt.Println(err)
} else {
    fmt.Println(result)
}

此外,如果您要创建一个200 class Adsorbate { private: matrix<double> m; public: Adsorbate() : m(3, 2) {} // ... }; 的数组,请使用Adsorbate

std::vector

答案 1 :(得分:2)

关于如何创建矩阵数组,您将询问如何为C ++数据结构创建C数组。调用malloc将无法正确初始化数组中的矩阵,如果ublas :: matrix的实例使用它,则调用“free”将释放动态内存,初始化实例失败并且无法破坏实例都是严重的错误,因为事情似乎似乎工作,取决于原始内存的内容,它可以是全零或应用程序可以处理的东西,但它也可能是垃圾导致灾难性的失败。 Malloc只会为实例返回内存,但在内部,有一个ublas :: matrix实例的Adsorbate实例可能认为它有内存或其他的有效指针。

要正确初始化阵列的各个成员,Adsorbate *adsorbates = new Adsorbate[200]; 将对所有Adsorbate实例使用默认构造函数。

你可以使它成为Adsorbate的默认构造函数用3,2构造其成员m struct Adsorbate { Adsorbate(): m{3, 2}, ... orther instance initializations here ... { ...arbitrary constructor code here.... } ... }

不建议使用数组。建议的方法是创建std::vector<Adsorbate>。使用std :: vector似乎更复杂,但事实并非如此,它会阻止你做一些看似简单的事情,这些事情可能是你不知道的灾难性事件。

如果您坚持使用裸阵列,请确保delete[]数组而不是delete。区别在于delete只调用一个元素的析构函数。