Гибкое имя структуры без переключателя

#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 , его можно заменить на a for (без 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 находится индекс цикла