मैं संरचना पुनरावृत्ति के बारे में सीख रहा हूं, और लूप में चीजों को आउटपुट करने की कोशिश कर रहा हूं

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
Plain_Dude_Sleeping_Alone 13 जिंदा 2017, 23:19
क्या आप सुनिश्चित हैं कि आपने परीक्षण के दौरान patient(3).name = 'New Name' नहीं जोड़ा? नया डेटा निर्दिष्ट करने से पहले clear patient patient को पूरी तरह से हटाने का प्रयास करें।
 – 
Suever
13 जिंदा 2017, 23:20
नमस्ते, नहीं, मुझे इस प्रश्न में बस इतना ही मिला है।
 – 
Plain_Dude_Sleeping_Alone
13 जिंदा 2017, 23:20
clear patient चलाएँ और फिर अपना कोड फिर से चलाएँ और मैं गारंटी देता हूँ कि आपको कोई समस्या नहीं होगी।
 – 
Suever
13 जिंदा 2017, 23:21
अरे यह काम करता है..., लेकिन मुझे नहीं पता क्यों? क्या मेरे आउटपुट के पिछले मान कैश हो गए थे?
 – 
Plain_Dude_Sleeping_Alone
13 जिंदा 2017, 23:22
धन्यवाद, कृपया आप इसे एक उत्तर के रूप में रखें ताकि मैं अपना प्रश्न समाप्त कर सकूं।
 – 
Plain_Dude_Sleeping_Alone
13 जिंदा 2017, 23:25

1 उत्तर

सबसे बढ़िया उत्तर

आपने पहले 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
%   []
2
Suever 13 जिंदा 2017, 23:32