Как передать структуру или объект класса функциям по ссылке в Matlab

У меня есть несколько больших матриц, которые нужно много раз передавать разным функциям в итеративном алгоритме. Как избежать ненужного копирования переменных в функцию для ускорения работы программы? Есть ли способ сгруппировать эти матрицы в структуру или класс и передать их по ссылке или указателю?

a=zeros(1000,1000);
b=zeros(1000,1000);
d=myfunction(a,b);
a=myfunction2(b,d);
....

Спасибо.

Обновление: я должен был предоставить более подробную информацию, как я вижу в комментариях. У меня есть несколько больших матриц. Некоторые из них остаются постоянными в программе, а другие меняются в каждой функции на каждой итерации. Итак, если я передаю эти матрицы по значению, Matlab делает копию этого, меняет значение и снова копирует их как вывод функции, а затем они выходят за рамки и уничтожаются, и на каждой итерации все это ненужное копирование делает программу ужасно медленно. Если бы мне нужно было запрограммировать это на C++, я бы использовал объектно-ориентированное программирование для этих матриц и передал бы их как ссылку на функцию, но я не знаю, возможно ли это в MATLAB.


person Eman    schedule 02.09.2016    source источник
comment
Если myfunction не изменяет a и b, то копии переменных не будет, они будут переданы как ссылки. MATLAB довольно умен и делает все это «из-под капота».   -  person Ander Biguri    schedule 02.09.2016
comment
См. stackoverflow.com/questions/38113315/   -  person Sam Roberts    schedule 02.09.2016
comment
@AnderBiguri Они не передаются по ссылке, они передаются по значению с копированием при записи. См. мой ответ на stackoverflow.com/questions /38113315/   -  person Sam Roberts    schedule 02.09.2016
comment
@SamRoberts да, ты прав! Дубликат должен исправить это!   -  person Ander Biguri    schedule 02.09.2016


Ответы (1)


Комментарий Андера абсолютно верен. Тем не менее, если вам нужны функции для изменения содержимого переменных, вы можете подумать о рефакторинге кода, чтобы попытаться избежать этого сценария. Я знаю, что код, который вы разместили, является просто упрощенным примером, но вы могли бы посмотреть на него и задать такие вопросы, как «нужно ли инициализировать a и b вне функции? Может ли функция инициализировать их и вернуть вместо этого?».

Если вы действительно не можете обойти это, вы можете инкапсулировать данные в класс дескриптора и вместо этого передать класс дескриптора функциям.

person CKT    schedule 02.09.2016
comment
Дело в том, что если OP не может обойти это, это означает, что ему / ей нужно будет, даже если это был C, сделать копию. В общем, ничего сверхъестественного не нужно. - person Ander Biguri; 02.09.2016
comment
Я не понимаю, как это обязательно означает, что когда-либо должна быть сделана копия. В примере он инициализирует две матрицы нулями, затем, предположительно, функция что-то с ними делает. По крайней мере, из примера не видно, что у него есть уже существующие данные, которые он должен избегать перезаписи. Конечная цель здесь, похоже, состоит в том, чтобы сгенерировать решение без многократного копирования. Но я не знаю. Если это так, то класс дескриптора в качестве контейнера поможет. - person CKT; 02.09.2016
comment
@CKT Спасибо за ответ. Некоторые из матриц остаются постоянными на протяжении всей программы, а другие матрицы меняются во всех функциях, вновь полученные матрицы используются в следующей функции и так далее. Другого пути нет, так как программа довольно большая. Я мог бы использовать глобальные переменные, которые затрудняют отладку, а также являются плохим стилем программирования, или я мог бы поместить эти матрицы в несколько структур или классов и передать их в качестве ссылок. - person Eman; 02.09.2016