2015-08-24 3 views
1

Я преобразовал некоторый код matlab в C++ с помощью кодера MATLAB.Преобразование вектора <> в emxArray_real_T в C++ после генерации кода из MATLAB

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

сгенерированный код для C++ дает мне следующую функцию:

void getTargetPoint(const emxArray_real_T *eyeMatrix, const emxArray_real_T 
       *HypAlpha, const emxArray_real_T *HypCov, const 
       emxArray_real_T *HypMean, const double xs[4], double Ymu[3]) 

Где Ymu является выходным я ищу. Однако, даже если я определил мои входы в виде массивов неопределенного размера в преобразователе, они являются переносчиками векторов в моем коде:

eyeMatrix = vector<vector <double>> 

Все они имеют разные размеры, например, eyeMatrix = [968x4], но в любой другой случай это может быть [ничего х 4]

Я пробовал много вещей, но я не могу управлять, чтобы преобразовать свои входные данные (вектор векторов) в тип: emxArray_real_T

есть ли вообще это делать? Или я должен преобразовать свои входные данные во что-то еще, а затем в emxArray_real_T?

Любая помощь или идея очень ценится!

+0

Является ли каждый вектор разного размера в векторе >? – Navan

ответ

2

Этот ответ предполагает, что eyeMatrix представляет собой прямоугольную матрицу (т.е. каждый внутренний вектор имеет одинаковую длину), поскольку сгенерированный код, вероятно, предназначен для работы с нерегулярными массивами.

Вы можете проверить:

https://stackoverflow.com/a/24271438/3297440

и documentation для обзора работы с emxArray* типами данных.

Резюмируя ответ, вы будете иметь функции, объявленные в файле <name>_emxAPI.h, которые выглядят как:

extern emxArray_real_T *emxCreateWrapper_real_T(double *data, int rows, 
               int cols); 
extern emxArray_real_T *emxCreate_real_T(int rows, int cols); 

Вы заметите, что первый принимает double *. Это должно быть указателем на ваши данные, хранящиеся в порядке столбцов.

Поскольку eyeMatrix, скорее всего, в строке-мажорная порядке и не может фактически быть смежными (я не знаю гарантию, что вложенная std::vectors результата в непрерывных данных) первый шаг может быть вызвать emxCreate_real_T с соответствующими размерами.

Это выделяет и возвращает emxArray_real_T, который мы можем назвать emx. emx->size будет иметь два элемента, которые вы задаете. Поле emx->data будет указателем на значения rows*cols (double) в вашем случае). Затем вы можете просто скопировать данные из eyeMatrix в emx->data в главном модуле.Так что, если ваша матрица:

1, 2 
3, 4 

Данные emx->data должны быть:

1, 3, 2, 4 

Оттуда, просто передать emx в качестве входных данных.

И наконец, не забудьте вызвать соответствующие функции emxDestroyArray* для очистки любой выделенной памяти, когда вы закончите с значениями emxArray_real_T.

+0

Спасибо большое @ RyanLivingston, я постараюсь разобраться, думаю, теперь я понял, как emxArray хочет получить данные! – Slash

+0

Звучит здорово, вы вполне приветствуете @Slash. Если у вас есть другие вопросы, отправьте ответ. –

+0

Мой код отлично работает @RyanLivingston! Еще раз спасибо, я очень ценю это – Slash