#arrays #matlab #reference
#массивы #matlab #ссылка
Вопрос:
У меня есть несколько векторов с семантическими идентификаторами (например inputs = [...]
,). Я хочу поместить их в массив ячеек, чтобы я мог перебирать их множество. Но когда я пытаюсь:
inputs(1).myfield = 2 % some arbitrary value
mycellarray{1} = inputs
inputs(1).myfield = 3 % some arbitrary value
assert(mycellarray{1}(1).myfield == inputs(1).myfield)
% => FAIL
Массив ячеек говорит, что {1}
содержит a 1x5 MyObject array
, но, по-видимому, он не ссылается на тот же объект, inputs
что и .
Как я могу достичь своей цели? (Я не могу поместить свои векторы в матрицу, поскольку векторы не имеют одинаковой длины.)
Комментарии:
1. В Matlab нет ссылок, вещи копируются
Ответ №1:
Как в комментарии, отмеченном в объектах Matlab, передаваемых по значению. Но следующий трюк можно выполнить в GNU Octave (в Matlab я не уверен):
ref = @(name) @(index) evalin('caller',sprintf('%s(%d)',name,index));
inputs(1).myfield = 2;
mycellarray{1} = ref('inputs');
inputs(1).myfield = 3;
assert(mycellarray{1}(1).myfield == inputs(1).myfield)
ref
это функция, которая получает name
и возвращает дескриптор функции, который получает index
и вычисляет выражение name(index)
Поэтому, когда мы пишем mycellarray{1} = ref('inputs');
, мы сохраняем дескриптор функции в cellarray .
Затем, когда мы записываем mycellarray{1}
возвращаемый дескриптор функции @(index) evalin('caller',sprintf('%s(%d)',name,index))
.
Когда мы пишем mycellarray{1}(1)
inputs(1)
, вычисляется выражение и возвращается его результат.
Когда мы пишем mycellarray{1}(1).myfield
myfield
возвращаемое поле (не работает в Matlab)
Примечание: с помощью приведенного выше метода myfield
можно получить только значение, но оно не может быть присвоено.
Комментарии:
1. В дополнение к тому, что MATLAB является вызовом по значению, стоит отметить еще одну вещь. В MATLAB также нет способа сохранить ячейку памяти в качестве переменной. Значение переменной всегда является значением того, что хранится в этой переменной.