2015-12-13 4 views
2

Я пытаюсь использовать несколько полей в структуре для изменения данных из данных в datetime. Структуру создавали:Доступ к нескольким полям в структуре matlab

DATA=struct('Id',[],'Date',[],'Value',[]); 

и из-за стиля приема данных существует несколько DATA, каждый из которых имеет одно значение. Таким образом, пример был бы достаточными полномочиями

Data(1).Date=2; 
    Data(2).Date=3; 

Теперь я хотел бы изменить запись в DateTime, но оставляя структуру данных, как это. В этом примере дается квадрат даты.

Data(1).Date=4; 
    Data(2).Date=9; 

структура имеет около 50000 enries и arrayfun() не дает достаточно эффективное решение. Я не могу найти способ конвертировать весь массив объявлений Data.Date один раз deal() написать все 50000 дат в каждом поле и любым другим способом получить ошибки. Есть ли у кого-нибудь решение изменить весь массив и записать его в каждом поле массива?

ответ

2

С помощью небольшого объезда преобразования формы-структуры в массив, а затем сделать математику, а затем преобразовать из массива в ячейку с запятыми списка на структуру:

arr=[Data(:).Date]; 
arr=num2cell(arr.^2); 
[Data(:).Date]=arr{:}; 
+0

Спасибо, ну это просто набухает. Я проверил производительность обоих данных решений против моего старого подхода arrayfun. для тех, кто заинтересован в выполнении даты и времени на 50000 записей: arrayfun - 23sec for loop - 3.3sec num2cell - 3.3sec Оба решения имеют одинаковую производительность, но я буду придерживаться num2cell, так как, как уже упоминалось, i хотел бы избежать циклов в коде. Еще раз спасибо вам – Finn

3

Вы можете поместить все значения в массив и затем повторно заполнить структуру после вычисления результатов.

arr=[Data(:).Date]; 
arr=arr.^2; 
for a=1:numel(arr) 
    Data(a).Date=arr(a); 
end 
+0

Это намного лучше, чем 'arrayfun() '(От 3 секунд до ~ 30 секунд), но я бы хотел избежать циклов, так как может быть способ справиться с этим как с массивом. neverless Thank You, я возьму это решение, если не будет другого. – Finn

+0

Возможно, вы попытаетесь сделать что-то вроде [Data (:). Date] = arr, но у меня нет копии Matlab для проверки этого. –

Смежные вопросы