Моя программа короткая и простая, предназначена для тестирования моего класса регрессии PCA.
#include <iostream>
#include <vector>
#include "data.generator.h"
#include "reg.class.h"
int main(int argc, char* argv[]) {
std::cout << "Flag A" << std::endl;
basicGenerator bg;
std::cout << "Sample size: " << bg.get_sampleSize() << std::endl;
bg.makeData();
std::cout << "Flag B" << std::endl;
std::vector<std::vector<double> > x;
std::vector<double> y;
bg.getDataForRegression(x,y);
unsigned int imax = y.size();
for (unsigned int i = 0 ; i < imax ; i++) {
std::cout << i << "\t" << y[i] << "\t" << x[i][0] << "\t" << x[i][1] << std::endl;
}
std::cout << "Flag C" << std::endl;
regressionPCA rpca(x,y);
return 0;
}
Вот конец вывода, который он производит:
89 0.416356 0.565407 -0.114605
90 -0.258883 -0.585597 -0.183372
91 0.833355 0.914344 0.81171
92 -0.0338814 -0.00264442 -0.118973
93 1.13764 0.41599 1.33175
94 -1.86323 -1.90867 -1.35118
95 0.907604 1.14917 0.621669
96 2.1166 1.06194 1.1703
97 0.159543 0.14446 -0.665135
98 -0.508617 -0.370597 -0.703225
99 2.69086 2.75267 1.40633
Flag C
Ted@Ted-acer-i7w7 ~/New.System/tests
$
Как вы можете видеть, последний вывод получен из флага, который я установил непосредственно перед созданием моего экземпляра regressionPCA в стеке.
Вот объявление этого класса.
#ifndef REG_CLASS_H
#define REG_CLASS_H
#include <iosfwd>
#include <vector>
//#include <boost/smart_ptr/shared_array.hpp>
#include <gsl/gsl_linalg.h>
class regressionPCA {
private:
unsigned int nrows, ncols;
// boost::shared_array<double> B, Y, U, V, S;
regressionPCA(void) {}; // makes default construction impossible
public:
regressionPCA(const std::vector<std::vector<double> >&, const std::vector<double>&);
void Reset(const std::vector<std::vector<double> >&, const std::vector<double>&);
inline void setNrows(unsigned int v) { nrows = v;};
inline void setNcols(unsigned int v) { ncols = v;};
inline unsigned int getNrows(void) const { return nrows; };
inline unsigned int getNcols(void) const { return ncols; };
};
#endif
Пожалуйста, обратите внимание, что вместо того, чтобы просто умереть без вывода, программа наиболее незаметно умерла с дампом ядра, когда я включил boost_ shared_array. Понятия не имею почему.
Вот реализация класса regressionPCA:
#include "reg.class.h"
#include <iostream>
#include <algorithm>
#include <gsl/gsl_linalg.h>
regressionPCA::regressionPCA(const std::vector<std::vector<double> >&data,
const std::vector<double>& Ydata) {
std::cout << "Flag ALPHA" << std::endl;
Reset(data,Ydata);
}
void regressionPCA::Reset(const std::vector<std::vector<double> >&data,
const std::vector<double>& Ydata) {
unsigned int r(0),c(0),n(0);
std::cout << "r: " << r << "\tc: " << c << "\tn: " << n << std::endl;
c = data.size();
std::cout << "r: " << r << "\tc: " << c << "\tn: " << n << std::endl;
r = data[0].size();
std::cout << "r: " << r << "\tc: " << c << "\tn: " << n << std::endl;
setNrows(r);
setNcols(c);
n = r * c;
std::cout << "r: " << r << "\tc: " << c << "\tn: " << n << std::endl;
double* B = new double[c];
double* Y = new double[r];
double* U = new double[n];
double* V = new double[c*c];
double* S = new double[c];
/* boost::shared_array<double> B(new double[c]),
boost::shared_array<double> B(new double[c]),
Y(new double[r]),
U(new double[n]),
V(new double[c*c]),
S(new double[c]);
B = Btmp;
Y = Ytmp;
U = Utmp;
V = Vtmp;
S = Stmp;*/
double *bptr = U.get();
std::cout << "Flag1" << std::endl;
std::vector<std::vector<double> >::const_iterator it = data.begin(), end = data.end();
while (it != end) {
bptr = std::copy(it->begin(), it->end(),bptr);
++it;
}
std::cout << "Flag2" << std::endl;
bptr = Y.get();
std::copy(Ydata.begin(),Ydata.end(),bptr);
gsl_matrix_view Um = gsl_matrix_view_array(U.get(), getNrows(), getNcols());
gsl_matrix_view Ym = gsl_vector_view_array(Y.get(), getNrows());
gsl_matrix_view Bm = gsl_vector_view_array(B.get(), getNcols());
gsl_matrix_view Sm = gsl_vector_view_array(S.get(), getNcols());
gsl_matrix_view Vm = gsl_matrix_view_array(U.get(), getNcols(), getNcols());
std::cout << "Flag3" << std::endl;
gsl_linalg_SV_decomp_jacobi(Um,Vm,Sm);
std::cout << "Flag4" << std::endl;
gsl_linalg_SV_solve(Um,Vm,Sm,Ym,Bm);
std::cout << std::endl << std::endl << "Sv = " << gsl_vector_get(Sm,0) << "\t" << gsl_vector_get(Sm,1) << std::endl;
std::cout << std::endl << std::endl << "V = " << std::endl;
std::cout << "\t" << gsl_matrix_get(Vm,0,0) << "\t" << gsl_matrix_get(Vm,0,1) << std::endl;
std::cout << "\t" << gsl_matrix_get(Vm,1,0) << "\t" << gsl_matrix_get(Vm,1,1) << std::endl;
std::cout << std::endl << std::endl << "Beta = " << gsl_vector_get(Bm,0) << "\t" << gsl_vector_get(Bm,1) << std::endl;
}
Обратите внимание, я знаю, что путь выполнения не попадает в конструктор, потому что строка "std :: cout <<" Flag ALPHA "<< std :: endl;" не производит вывод. </p>
Итак, пара загадок.
1) Почему простое добавление shared_array в boost вызывает дамп ядра?
2) когда я прибегаю к указателям на обнаженные массивы (да, я знаю об утечке памяти, но сейчас это наименьшая из моих проблем, и я бы избежал, если бы у меня работал общий массив boost), почему выполнение не входит мой конструктор?
Любые идеи будут оценены.
Кстати: если вы заметили, что я делаю что-то глупое с GSL, я был бы рад узнать об этом, даже если мои проблемы, похоже, не связаны с GSL.