У меня есть код C++, который взаимодействует с Matlab через API Engine C. Мой код создает временные переменные в рабочей области Matlab, которые он старательно очищает с помощью вызовов clear
как можно скорее. Однако в какой-то момент мое приложение дает сбой, сообщая мне, что оно не может создать следующую временную переменную Matlab (обычно после ~ 65530 таких операций).
После некоторых экспериментов с командной строкой Matlab я обнаружил, что могу воссоздать эту проблему в чистом Matlab (то есть независимо от моего кода C++ и использования им Engine API). Рассмотрим следующий код:
for i = 1 : 100000
eval(sprintf('x_%d = %d', i, i));
whos
eval(sprintf('clear x_%d', i));
whos
end
Выполняя этот код на моем 32-битном ноутбуке с Windows с Matlab R2008B (древний, я знаю), цикл в конечном итоге прерывается с сообщением об ошибке:
В текущей рабочей области уже слишком много переменных; нет места для "x_65532".
Итак, кажется, что по крайней мере эта устаревшая версия Matlab имеет ограничение таблицы символов в 64 КБ. Возможно, в более новых (64-разрядных) версиях Matlab предел больше - мне было бы интересно услышать, какие результаты получают другие.
Однако более интересный вопрос заключается в том, какой эффект вызывает вызов clear
и как обойти его странное поведение. Вот результат итерации немного до прерывания:
x_65530 =
65530
Name Size Bytes Class Attributes
i 1x1 8 double
x_65530 1x1 8 double
Name Size Bytes Class Attributes
i 1x1 8 double
Как вы можете видеть, вывод whos
ясно показывает, что временные файлы из предыдущих итераций были удалены из рабочей области, и очистка, похоже, работает, как и ожидалось. Тем не менее, таблица символов, по-видимому, исчерпала свои возможности.
Итак, два вопроса для ТАК верующих:
- Как я могу обойти это несколько произвольное ограничение? То есть чем заменить мои
clear
вызовы? - Изменилось ли это поведение с более новыми и/или 64-разрядными версиями Matlab?
eval
для первогоsprintf
внутри цикла... - person Eitan T   schedule 02.12.2013i
, извлеченный из имени, вам следует просто добавить вторую переменную - или использовать одну структурную переменную, например. с полямиx
иi
, значения которых вы можете обновить. - person sebastian   schedule 02.12.2013