MATLAB cellarray не содержит ссылок?

#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 также нет способа сохранить ячейку памяти в качестве переменной. Значение переменной всегда является значением того, что хранится в этой переменной.