Как создать массив строк в MATLAB? - PullRequest
3 голосов
/ 19 мая 2010

Я хотел бы передать вектор строк из C ++ в MATLAB. Я пытался использовать доступные функции, такие как mxCreateCharMatrixFromStrings, но это не дает мне правильного поведения.

Итак, у меня есть что-то вроде этого:

void mexFunction(
    int nlhs, mxArray *plhs[],
    int nrhs, const mxArray *prhs[])
{
   vector<string> stringVector;
   stringVector.push_back("string 1");
   stringVector.push_back("string 2");
   //etc...

Проблема в том, как передать этот вектор в среду Matlab?

   plhs[0] = ???

Моя цель - бежать:

>> [strings] = MyFunc(...)
>> strings(1) = 'string 1'

Ответы [ 2 ]

5 голосов
/ 19 мая 2010

Хранение вектора строк в виде матрицы символов требует, чтобы все ваши строки имели одинаковую длину и чтобы они сохранялись в памяти непрерывно.

Лучший способ сохранить массив строк в MATLAB - использовать массив ячеек, попробуйте использовать mxCreateCellArray, mxSetCell и mxGetCell. Под капотом массивы ячеек в основном представляют собой массив указателей на другие объекты, массивы символов, матрицы, другие массивы ячеек и т. Д.

0 голосов
/ 27 марта 2019
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    int rows = 5;
    vector<string> predictLabels;
    predictLabels.resize(rows);
    predictLabels.push_back("string 1");
    predictLabels.push_back("string 2");
    //etc...

    // "vector<string>" convert to  matlab "cell" type
    mxArray *arr = mxCreateCellMatrix(rows, 1);
    for (mwIndex i = 0; i<rows; i++) {
        mxArray *str = mxCreateString(predictLabels[i].c_str());
        mxSetCell(arr, i, mxDuplicateArray(str));
        mxDestroyArray(str);
    }
    plhs[0] = arr;
}
...