Отправка матрицы с каждой итерацией: 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.