#matlab #switch-statement #matlab-struct
#matlab #оператор переключения #matlab-struct
Вопрос:
Для моего кода мне нужна изменяемая структура. В зависимости от счетчика структура должна добавлять дополнительные поля. Все поля должны быть гибкими и могут иметь разные значения. В настоящее время я использую switch
условие. Для прозрачности я хотел бы это изменить. Чтобы привести пример, мой приведенный ниже код может принимать разные значения для (spl{1,i}{1})
(например, ввода / вывода, …). Последнее число ( 1
) считается до тех structlength
пор, пока не будет достигнуто. Поэтому, если structlength
равно 2
, код будет выглядеть следующим образом: testData.(spl{1,i}{1}).(spl{1,i}{2})
Подводя итог: возможно ли устранить условие переключения?
switch structLength
case 1
testData.(spl{1,i}{1}) = emptyMat;
case 2
testData.(spl{1,i}{1}).(spl{1,i}{2}) = emptyMat;
case 3
testData.(spl{1,i}{1}).(spl{1,i}{2}).(spl{1,i}{3}) = emptyMat;
case 4
testData.(spl{1,i}{1}).(spl{1,i}{2}).(spl{1,i}{3})...
.(spl{1,i}{4}) = emptyMat;
case 5
testData.(spl{1,i}{1}).(spl{1,i}{2}).(spl{1,i}{3})...
.(spl{1,i}{4}).(spl{1,i}{5}) = emptyMat;
case 6
testData.(spl{1,i}{1}).(spl{1,i}{2}).(spl{1,i}{3})...
.(spl{1,i}{4}).(spl{1,i}{5}).(spl{1,i}{6}) = emptyMat;
Комментарии:
1. Возможно
swtich
, его можно заменить на afor
(безeval
). Но вам действительно нужна такая сложная структура с вложенной структурой?2. Это похоже на структуру данных, которую вы (или тот, кто наследует этот код) будете ненавидеть. Подумайте о том, чтобы просто иметь 6 разных структур, или использовать массивы ячеек, или в основном что-нибудь с более плоской иерархией
Ответ №1:
switch
Может быть заменено for
циклом (без eval
) следующим образом. Но я предлагаю вам использовать более простую структуру данных, что облегчит вашу жизнь.
% Example data
emptyMat = [10 22];
structLength = 3;
spl = {{'a', 'bb', 'ccc'}};
ii = 1;
% Create the nested struct
testData = emptyMat; % Result so far. Will be wrapped into fields from inner to outer
for k = structLength:-1:1
testData = struct(spl{1,ii}{k}, testData); % wrap into an outer field
end
Проверьте:
>> testData
testData =
struct with fields:
a: [1×1 struct]
>> testData.a
ans =
struct with fields:
bb: [1×1 struct]
>> testData.a.bb
ans =
struct with fields:
ccc: [10 22]
>> testData.a.bb.ccc
ans =
10 22
Комментарии:
1. Это уже было весьма полезно. Тем не менее, spl — это матрица с более чем 900 ячейками, и я запускаю цикл для каждой записи. Таким образом, TestData будет удаляться каждый раз. Как я могу это предотвратить?
2. @bg_rohm Извините, я не уверен, что понимаю, что вы имеете в виду. Возможно, инициализируйте некоторые
TestDataAll
, а затем внутри цикла сохранитеTestDataAll{k} = TestData;
, гдеk
находится индекс цикла