Как делают я получаю доступ к полям структуры динамично?

Select DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)

DateDiff (День, 0, GetDate ()) совпадает с DateDiff (День, '1900-01-01', GetDate ())

, Так как DateDiff возвращает целое число, Вы получите количество дней, которые протекли начиная с Jan 1, 1900. Вы тогда добавляете что целое число дней к Jan 1, 1900. Результирующий эффект удаляет компонент времени.

я должен также упомянуть, что этот метод работает на любую часть даты/времени (как год, четверть, месяц, день, час, минута, и второй).

Select  DateAdd(Year, DateDiff(Year, 0, GetDate()), 0)
Select  DateAdd(Quarter, DateDiff(Quarter, 0, GetDate()), 0)
Select  DateAdd(Month, DateDiff(Month, 0, GetDate()), 0)
Select  DateAdd(Day, DateDiff(Day, 0, GetDate()), 0)
Select  DateAdd(Hour, DateDiff(Hour, 0, GetDate()), 0)
Select  DateAdd(Second, DateDiff(Second, '20000101', GetDate()), '20000101')

последний, в течение многих секунд, требует специальной обработки. Если Вы будете использовать Jan 1, 1900 Вы получит ошибку.

Различие двух столбцов даты и времени вызвало переполнение во времени выполнения.

можно обойти эту ошибку при помощи различной ссылочной даты (как Jan 1, 2000).

32
задан gnovice 29 March 2017 в 21:34
поделиться

3 ответа

Попробуйте динамическую ссылку на поле, в которой вы помещаете строку в круглые скобки, как показано на строке, определяющей материал .

S = struct('A', [1 2], 'B',[3 4 5]); 
SNames = fieldnames(S); 
for loopIndex = 1:numel(SNames) 
    stuff = S.(SNames{loopIndex})
end 

Я согласен со Стивом и Адамом. Используйте клетки. Однако этот синтаксис подходит для людей в других ситуациях!

44
ответ дан 27 November 2019 в 20:22
поделиться

Здесь я хотел бы отметить три момента:

  • Причина, по которой вы получаете ошибку в приведенном выше коде, заключается в том, как вы индексируете SNames . Функция fieldnames возвращает массив ячеек строк, поэтому вам нужно использовать индексирование содержимого (т.е. фигурные скобки) для доступа к строковым значениям. Если вы измените четвертую строку вашего кода на это:

     field = getfield (S, SNames {loopIndex});
    

    then your code should work without error.

  • As suggested by MatlabDoug, you can use dynamic field names to avoid having to use getfield (which yields cleaner looking code, in my opinion).

  • The suggestion from Adam to use a cell array instead of a structure is right on the mark. This is generally the best way to collect a series of arrays of different length into a single variable. Your code would end up looking something like this:

    S = {[1 2], [3 4 5]}; % Create the cell array
    for loopIndex = 1:numel(S) % Loop over the number of cells
     array = S{loopIndex}; % Access the contents of each cell
     % Do stuff with array
    end
    
16
ответ дан 27 November 2019 в 20:22
поделиться

Подход getfield в порядке (хотя сейчас у меня нет доступной MATLAB, и это не ясно для мне, почему вышеуказанное не сработает).

Для альтернативной структуры данных вы также можете захотеть изучить массивы ячеек MATLAB. Они также позволят вам хранить и индексировать векторы различной длины.

5
ответ дан 27 November 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: