Отправка матрицы с каждой итерацией: Matlab "engine.h" c ++ - PullRequest
4 голосов
/ 13 января 2012

Этот вопрос возникает после решения проблемы, с которой я столкнулся в этом вопросе .У меня есть код C ++, который обрабатывает кадры с камеры и генерирует матрицу для каждого обработанного кадра.Я хочу отправить в Matlab Engine каждую матрицу, поэтому в конце выполнения я сохранил все матрицы.Я запутался в том, как это сделать, я посылаю матрицу в каждой итерации, но она все время перезаписывается, поэтому в конце у меня только одна.Вот пример кода:

matrix.cpp

#include helper.h

mxArray *mat;   
mat = mxCreateDoubleMatrix(13, 13, mxREAL);     
memcpy(mxGetPr(mat),matrix.data, 13*13*sizeof(double));
engPutVariable(engine, "mat", mat);

Я также пытался использовать счетчик для динамического именования различных матриц, но он не работал, поскольку движок matlab требует переменныхбыть определенным первым.Любая помощь будет оценена.Спасибо.

Ответы [ 3 ]

5 голосов
/ 13 января 2012

Вы можете создать массив ячеек в рабочей области Matlab следующим образом:

    mwSize size = 10;
    mxArray* cell = mxCreateCellArray(1, &size);

    for(size_t i=0;i<10;i++)
    {
        mxArray *mat;   
        mat = mxCreateDoubleMatrix(13, 13, mxREAL);     
        memcpy(mxGetPr(mat),matrix.data, 13*13*sizeof(double));

        mwIndex subscript = i;
        int index = mxCalcSingleSubscript(cell , 1,&subscript); 
        mxSetCell(m_cell , index, mat);
   }

   engPutVariable(engine, "myCell", cell);
4 голосов
/ 13 января 2012

Если вы не знаете количество кадров априори, не пытайтесь развернуть mxArray в C. Это не удобно.Вы были уже близко к началу.Все ваши проблемы могут быть решены с помощью:

engEvalString(engine, "your command here")

Подробнее здесь .

Самый простой подход выглядит примерно так:

engPutVariable(engine, "mat", mat);
engEvalString("frames{length(frames)+1} = mat;");

Не делайте это именно так, это иллюстрация и будет очень медленной.Намного лучше предварительно выделить, скажем, 1000 кадров, а затем увеличить его еще на 1000 (или более подходящее число), когда это необходимо.Еще лучше не использовать массивы клеток, которые работают медленно.Вместо этого вы можете использовать трехмерный массив, например:

frames = zeros(13,13,1000);
frames(:,:,i) = mat;
i = i + 1;

Опять же, предварительно распределить в блоках.Вы поняли идею.Если вам действительно нужно быть быстрым, вы можете построить 3D-массивы в C и отправить их в MATLAB, когда они заполнятся.

3 голосов
/ 13 января 2012

Может быть, вы можете использовать vector<mxArray> из stdlib.

...