Отправка матрицы с каждой итерацией: Matlab "engine.h" C++

Этот вопрос возникает после решения проблемы, возникшей в этом вопросе. У меня есть код 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 ответа

Решение

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

engEvalString(engine, "your command here")

Узнайте больше здесь.

Самый простой подход - это что-то вроде:

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

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

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

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

Вы можете создать массив ячеек в рабочей области 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);

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

Другие вопросы по тегам