استفاده از آرایه سلولی در ساختارها
برای ایجاد یک ساختار(struct) در متلب می توانیم به صورت های زیر عمل کنیم:
مثال
s = struct
s = struct(field,value)
s = struct(field1,value1,...,fieldN,valueN)
s = struct([])
s = struct(obj)
توضیح:
عبارت s = struct یک ساختار اسکالر(یعنی 1 در 1 ) ایجاد می کند که هیچ فیلدی ندارد.
عبارت s = struct(field,value) یک ساختار ایجاد می کند که یک فیلد و یک مقدار دارد. آرگومان value می تواند هرنوع داده ای باشد.مثلا می تواند به صورت عددی، یا منطقی یا کاراکتر یا آرایه باشد.
- اگر value یک آرایه ی سلولی نباشد، ساختار s یک مقدار اسکالر(1 در 1 یا یک بعدی) محسوب می شود، به طوری که داریم: s.(field) = value
- اگر value یک آرایه ی سلولی باشد، s یک نوع ساختار آرایه ای محسوب می شود که ابعاد این آرایه با ابعاد آرایه ی سلولی(value) یکسان است. هر عنصری از s(همان آرایه) که به آن اشاره کنیم، دقیقا به عنصری مشابه از value اشاره می کند. به عنوان مثال اگر عبارت s = struct('f',{'a','b'}) را در متلب وارد کنیم، خواهیم دید که s(1).f برابر با a می شود و s(2).f برابر با b می شود. به مثال زیر توجه کنید:
مثال
>> s = struct('f',{'a','b'})
s =
1×2 struct array with fields:
f
>> s(1).f
ans =
a
>> s(2).f
ans =
b
- اگر value یک آرایه ی سلولی خالی، یعنی {} باشد، آنگاه s یک ساختار خالی(0 در 0) خواهد بود.
عبارت s = struct(field1,value1,...,fieldN,valueN) یک ساختار آرایه ای ایجاد می کند که چند فیلد دارد. هر مقدار غیر اسکالر(غیر یک بعدی) که در داخل value1 و ... و valueN قرار گیرد، باید ابعاد یکسانی داشته باشد. این یعنی اگر دو فیلد در متغیری وجود داشته باشد، که هرکدام از آنها حاوی یک آرایه ی سلولی غیر خالی باشند، آنگاه این دو آرایه ی سلولی باید ابعاد یکسانی داشته باشند. به مثال زیر توجه کنید:
مثال
>> x1 = struct('f1',{1,2,3})
x1 =
1×3 struct array with fields:
f1
>> x2 = struct('f1',{1,2,3},'f2',{4,5,6})
x2 =
1×3 struct array with fields:
f1
f2
>> x3 = struct('f1',{1,2,3},'f2',{4,5,6,7})
Error using struct
Array dimensions of input '4' must match those of input '2', or be scalar.
>>
تشریح مثال بالا:
در دستورات بالا، در خط شماره 1، یک ساختار ایجاد کردیم و در فیلد f1، یک آرایه ی سلولی با سه مقدار تعریف کردیم. در خط شماره 9، یک ساختار دیگر ایجاد کردیم و علاوه بر فیلد f1، یک فیلد به نام f2 تعریف کردیم و برای آن یک آرایه ی سلولی دیگر با سه مقدار، یعنی با ابعاد یکسان تعریف کردیم. که اینجا هیچ مشکلی به وجود نیامد. اما در خط 18، همان طور که مشاهده می کنید، برای آرایه ی سلولی فیلد f2، یک مقدار اضافی(یعنی عدد 7) را تعریف کرده ایم. این یعنی ابعاد دو آرایه ی سلولی با یکدیگر برابر نیستند و خطا ایجاد شد.
نکته1: در عبارت s = struct(field1,value1,...,fieldN,valueN) ، اگر هیچ یک از value ها، آرایه ی سلولی نباشند آنگاه ساختار s یک ساختار اسکالر محسوب می شود. و یا اگر تمام valueها آرایه ی سلولی یک بعدی(اسکالر) باشند، آنگاه s نیز یک ساختار اسکالر محسوب می شود.
نکته 2: اگر حداقل یکی از valueها، یک آرایه ی سلولی غیر اسکالر(غیر یک بعدی یا یک عنصری) باشد، آنگاه ابعاد s برابر با ابعاد آن آرایه ی سلولی خواهد بود. به مثال زیر توجه کنید:
مثال
>> x1 = struct('f1',{1,2,3},'f2','m')
x1 =
1×3 struct array with fields:
f1
f2
-
همان طور که در خط 5 مشاهده می کنید، ابعاد ساختار، 1 در 3 است، یعنی برابر با ابعاد آرایه ی سلولی.
- نکته3: اگر یکی از valueها برابر با یک آرایه ی سلولی خالی، یعنی {} باشد، آنگاه s نیز یک ساختار خالی(0 در 0) در نظر گرفته می شود. بنابراین اگر می خواهید در ساختار خود، از یک مقدار خالی برای یک فیلد استفاده کنید، و می خواهید دیگر فیلدها نیز آسیب نبینند، می توانید از یک [] بعنوان مقدار آن فیلد استفاده کنید.
نکته 4: اگر عبارت s = struct([]) را در متلب وارد کنیم، یک ساختار خالی(0در0) بدون هیچ فیلدی ایجاد می شود.
نکته 5: عبارت s = struct(obj) یک ساختار ایجاد می کند که فیلدها و مقادیر آن با متغیرها(یعنی پروپرتی ها) و مقادیر آنها در شیء obj تطابق دارند و برابر هستند.
چند مثال در مورد ساختارها در متلب
- نوشته شده توسط احسان عباسی
- بازدید: 3327