У меня есть функция Matlab, преобразованная в C ++ с использованием Matlab Coder. Вход представляет собой одномерный массив :Infx1
и вывод функции Matlab представляет собой двумерный массив. Я инициализирую это (вывод), используя
result = zeros(500,18);
В моем основном цикле я поддерживаю переменную count
который варьируется от 1 до 500, и до конца цикла я заполняю выходной массив, используя
result(count,:) = blocks;
где блоки — это вектор 18×1, вычисляемый в каждом цикле.
В моем преобразованном файле C ++ я ожидаю result
быть двумерным массивом. Но это, оказывается, вектор с выводом, данным
for (loop_ub = 0; loop_ub < 18; loop_ub++) {
result[(count + 500 * loop_ub) - 1] = blocks[loop_ub];
}
Инициализация result
можно рассматривать как
memset(&result[0], 0, 9000U * sizeof(real_T));
Я не могу понять причину, почему это не двумерный массив. Любая помощь высоко ценится.
Спасибо
Вся память в конечном счете плоская (одномерная), и вы часто получаете лучшую производительность при такой интерпретации. В этом случае подойдет одно выделение (размером 500 * 18 * sizeof (real_T)), так что Matlab использует его — вы получите лучшую производительность кэширования благодаря пространственной локализации. Генератор кода мог бы обернуть выделение в тип многомерного массива (например, см. этот вопрос), но это скрывает тот факт, что каждый ряд на самом деле является непрерывным в памяти, полезный факт, чтобы знать. В противном случае, например, было бы непонятно, что для инициализации массива можно использовать один набор mem.