У меня есть функция Matlab, преобразованная в C++ с использованием Matlab Coder. Вход представляет собой одномерный массив :Infx1
а выход функции Matlab - это 2-мерный массив. Я инициализирую это (выход), используя
result = zeros(500,18);
В моем основном цикле я поддерживать переменный count
, который изменяется от 1 до 500 и до конца цикла я заполнить выходной массив, используя
result(count,:) = blocks;
где блоки представляют собой вектор 18x1, вычисленный в каждом цикле.
В моем преобразованном файле 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));
Я не могу понять, почему это не 2-мерный массив. Любая помощь высоко ценится.
благодаря
Вся память в конечном счете плоская (1-мерная), и вы часто получаете лучшую производительность при ее интерпретации. В этом случае будет выполняться одно распределение (размером 500 * 18 * sizeof (real_T)), поэтому Matlab использует его - вы получите лучшую производительность кеширования из-за пространственной локальности. Генератор кода мог бы обернуть выделение в многомерном типе массива (например, см. Этот вопрос), но это скрывает тот факт, что каждая строка действительно смежна в памяти, что полезно знать. В противном случае, например, было бы неясно, что для инициализации массива можно использовать один memset.