Как преобразовать std :: vector в матрицу в Eigen? - PullRequest
0 голосов
/ 10 сентября 2018

Я немного новичок в Stack Overflow и C ++, поэтому не стесняйтесь исправлять любые ошибки в моем коде и форматировании этого вопроса.

Я пытаюсь сделать калькулятор линейной регрессии, используя нормальное уравнение, которое включало транспонирование матриц и умножение векторов (и их обратных). Предполагается, что программа читает из CSV-файла и передает информацию из этого файла в матрицу и вычисляет линию регрессии. Чтобы упростить работу, я решил использовать библиотеку Eigen для умножения матриц на матрицы.

Проблема, с которой я столкнулся, заключается в том, что функция Map может принимать только массив, а не std :: vector.

Это то, что я имею до сих пор:

float feature_data[] = { 1, 1, 1, 1, 1, 1,
                         2, 4.5, 3, 1,4, 5};
float labels[] = { 1, 4, 3, 2, 5, 7 };


//maps the array to a matrix called "feature_data"
MatrixXf mFeatures = Map< Matrix<float, 6, 2> >(feature_data);
MatrixXf mLabels = Map< Matrix<float, 6, 1> >(labels);

//use the toArray function
std::vector<float> test_vector = { 2,1,3 };
float* test_array = toArray(test_vector);


calcLinReg(mFeatures, mLabels);

const int n = 2;
int arr[n];

system("pause");

Для контекста, функция toArray - моя неудачная попытка создать массив из вектора (честно говоря, он работает, но возвращает указатель, который нельзя передать в функцию Map в Eigen.) calcLinReg делает именно то, на что это похоже: вычисляет параметры линии линейной регрессии.

Могу ли я в любом случае преобразовать вектор в массив или преобразовать вектор в матрицу в Eigen?

1 Ответ

0 голосов
/ 10 сентября 2018

Как насчет попытки использовать векторы data() метод , который дает вам доступ к массиву памяти, используемому внутренне вектором, например:

    std::vector<float> test_vector = { 2,1,3 };
    float* test_array = test_vector.data();
    Eigen::MatrixXf test = Eigen::Map<Eigen::Matrix<float, 3, 1> >(test_array);

или короче:

    std::vector<float> test_vector = { 2,1,3 };
    Eigen::MatrixXf test = Eigen::Map<Eigen::Matrix<float, 3, 1> >(test_vector.data());

Осторожно Назначение фактически копирует данные, поэтому это безопасно. Тем не менее, вы также можете напрямую использовать данные вектора, как это

    std::vector<float> test_vector(3,2);
    Eigen::Map<Eigen::Matrix<float, 3, 1> > dangerousVec (test_vector.data());

Если вектор выходит из области видимости, память освобождается, а данные опасных данных становятся опасными.

...