2017-01-13 15 views
0

Я учусь о структуре итерации, и пытаюсь выводить вещи в петлеОткуда берутся эти «Новые имена» и «[]»?

patient(1).name = 'John Doe'; 
patient(1).billing = 127.00; 
patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205]; 
patient(2).name = 'Ann Lane'; 
patient(2).billing = 28.50; 
patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169]; 

fields = fieldnames(patient) 

%numel is number of elements 
for i=1:numel(fields) 
    fields(i) 
    patient.(fields{i}) 
end 

В течение этого patient.(fields{i}), это дает 'New Name' и [], которые не являются частью моей struct. Откуда берутся эти ценности?

Выхода:

ans = 'name' 
ans = John Doe 
ans = Ann Lane 
ans = New Name 
ans = 'billing' 
ans = 127 
ans = 28.5000 
ans = [] 
ans = 'test' 
ans = 79.0000 75.0000 73.0000 
    180.0000 178.0000 177.5000 
    220.0000 210.0000 205.0000 
ans = 68 70 68 
    118 118 119 
    172 170 169 
ans = [] 
+0

Уверены, что вы не добавили 'patient (3) .name = 'New Name'' во время тестирования? Попробуйте «очистить пациента», чтобы полностью удалить «пациента», прежде чем назначать новые данные. – Suever

+0

Привет, нет, это все, что у меня есть. –

+0

Запустите 'clear patient', а затем снова запустите свой код, и я гарантирую, что у вас не будет проблем. – Suever

ответ

2

Вы должны быть предварительно назначены patient(3).name = 'New Name' и поскольку код только чрезмерно записывает первые и вторые элементы из patient, третий элемент остается нетронутым, и поэтому появляется во время зацикливания.

Вы можете проверить это с помощью size или numel

numel(patient) 
% 3 

Чтобы предотвратить это, вы можете инициализировать struct на пустой struct перед назначением

% Initialize it 
patient = struct() 

% Now populate 
patient(1).name = 'whatever'; 

Или явно очистить переменную clear patient чтобы этого не произошло.

clear patient 

% Now populate it 
patient(1).name = 'whatever'; 

Кроме того, в качестве побочного сведению, по причине того, что остальные поля являются [] потому, что если вы добавляете новое поле в существующей struct массива, то все struct записи в массиве будет получать [] в качестве значения для нового поля

clear patient 

patient(2).name = 'New Name'; 
patient(1).name = 'Test'; 

% Add a new field only to patient(2) 
patient(2).date = 'today'; 

% patient(1).date becomes [] 
patient(1).date 
% [] 

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

  • Нет связанных вопросов^_^