В нашем коде MATLAB мы много использовали ссылки на динамические поля, и они довольно фантастические. У нас есть много разных структур данных с разными наборами полей, поэтому становится намного проще получить доступ к любой из них, просто используя нотацию struct.('field'), без использования оператора eval.
Тем не менее, где мы сталкиваемся с проблемами, так это то, что многие из этих структур имеют несколько уровней, и мы не всегда знаем, насколько глубоко в структуру нам нужно будет проникнуть. В идеале мы хотели бы иметь к ним доступ без использования оператора eval, возможно, что-то вроде
struct.('field.field2.field3')
Есть ли способ динамического доступа к структурам с неизвестной глубиной с помощью встроенных функций? Или нам нужно будет создать специальную функцию для доступа ко всем нашим структурам?
Или вы ищете struct.('field').('field2').('field3')?
@AnderBiguri это ближе всего к struct.('unknown_amount_of_variables.desired_field').
Вам нужно прочитать это, или написать, или и то, и другое? Могут ли они повторить? Может ли field3 находиться в разных местах в структуре?
Пожалуйста, объясните, как вы получаете имена динамических полей.
Облегчает ли решение этой проблемы знание того, что structB = structA.('fieldB'); не копирует никаких данных?
@MohsenNosratinia Я не думаю, что это дубликат, поскольку OP упомянул, что они не знают переменных структуры. Просто где-то есть один с таким именем.
@Wolfie, не могли бы вы рассказать о последствиях для производительности?
@excaza У меня нет короткого теста для демонстрации, но часто в коде профилирования я видел, что индексирование с точечной нотацией может быть узким местом, особенно в отношении, например, индексации матрицы или массива ячеек. Сделав структуры данных как можно более плоскими, упростит доступ. Как только вам понадобятся вспомогательные функции для поиска полей для вас (при необходимости здесь), я могу только представить, что это станет во много раз более заметным! Не поймите меня неправильно, они часто могут сэкономить много работы по управлению рабочим пространством и ускорить кодирование, я просто отмечаю, что они не лучший метод де-факто.
Я снова открыл вопрос, потому что то, что спросил OP, не в том, что находится в цели обмана.
@AnderBiguri Я принял дубликат, потому что он, по сути, такой же, как то, что я собирался спросить. Я неправильно понял ваш первый комментарий для пояснения. Я знаю точное местоположение нужного поля, но только после того, как мне передадут строку с именами полей. Я не знаю, будет ли эта струна двухуровневой, пяти или двадцатой.
@DavidK, но тогда вы не можете использовать связанный дубликат, нет? потому что для этого вам нужны все поля.
@AnderBiguri Мне передали строку, которая может быть field1.desiredField, field1.field2.desiredField или field1.<more levels>.desiredField. Я точно буду знать, где находится поле. Я пытался выяснить, есть ли встроенная функция, которая позволила бы мне получить доступ к этому полю динамически без использования eval или необходимости самостоятельно анализировать и зацикливать все.
ОК .... тогда закройте как дубликат.
@DavidK Вы можете принять этот ответ как действительный, даже если вам понадобится что-то еще, для будущих читателей, у которых может быть проблема, которую вы описали





Этот код работает для следующих предположений и случаев использования:
Работает следующая функция:
function [fieldplace]=findfield(s,field)
% is one of these?
fieldplace = {};
if (isfield(s,field))
fieldplace{end+1}=field;
return;
end
if ~isstruct(s)
fieldplace = {};
return;
end
% otherwise is nested somewhere, use recursivity.
fnames=fieldnames(s);
for ii=1:numel(fnames)
fieldplace=findfield(s.(fnames{ii}),field);
if ~isempty(fieldplace)
fieldplace=[fnames{ii} fieldplace];
return;
end
end
end
Случай использования:
s.a=1;
s.b.c=2;
s.b.d=3;
s.e.f.g=4;
s.h.i.j.k=5;
result=findfield(s,'k');
Вы можете читать это поле как:
getfield(s,result{:})
А вот с
struct.('field.field2.field3')глубины нет? Или этоstruct.('unknown_amount_of_variables.desired_field')?