انجمن سایت کلیدستان


رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
رسم ماتریس سه بعدی به صورت سه بعدی

رسم ماتریس سه بعدی به صورت سه بعدی

#1
سلام ، من یک ماتریس سه بعدی دارم که میخوام به صورت سه بعدی رسم کنم. خروجی باید به شکل زیر دیده بشه. ماتریس مربوطه هم الصاق شده است. لطفا راهنمایی کنید.ضمنا دستوری که در حالت دوبعدی برای رسم یک مقطع دوبعدی از این ماتریس استفاده میشه imagesc است ولی در سه بعد رو نمیدونم.

   

http://s5.picofile.com/file/8128282226/matrix.mat.html
دوست دارم زندگی رو . . . 
پاسخ

رسم ماتریس سه بعدی به صورت سه بعدی

#2
سلام.
برای اینگونه شکل ها، باید از دستور slice استفاده کنیم. یعنی 3 سطح مورد نظر رو با دستور slice رسم می کنیم.

مثال :
من در این مثال، 6 سطح رو رسم می کنم که چون 3 تا از آنها در پشت 3 تای دیگر قرار می گیرد، در آنچه دیده می شود، تفاوتی نمی کند :

کد:
clear all
close all
clc

load wind
xmin = min(x(:));
xmax = max(x(:));
ymin = min(y(:));
ymax = max(y(:));
zmin = min(z(:));
zmax = max(z(:));

wind_speed = sqrt(u.^2 + v.^2 + w.^2);
hsurfaces = slice(x,y,z,wind_speed,[xmin,xmax],[ymin,ymax],[zmax,zmin]);
set(hsurfaces,'FaceColor','interp','EdgeColor','none')

نتیجه اجرای کد متلب بالا :
   

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط 4i469x

رسم ماتریس سه بعدی به صورت سه بعدی

#3
با تشکر ، خط های زیر رو متوجه نمیشم ! x و y و z رو از کجا میخونه ، میشه توضیح بدید. ممنون.

کد:
xmin = min(x(:));
xmax = max(x(:));
ymin = min(y(:));
ymax = max(y(:));
zmin = min(z(:));
zmax = max(z(:));

 ضمنا من هیچ ایده ای برای به کارگیری کدهای شما برای نمایش داده مصنوعی که ساختم و شکل همون عکس قبلیه، ندارم . میتونید داده مصنوعی که لینکش رو در پست قبلیم داده ام رو از طریق این دستور رسم کنید؟ من هم دارم روش کار میکنم.
دوست دارم زندگی رو . . . 
پاسخ

رسم ماتریس سه بعدی به صورت سه بعدی

#4
شما ابتدا کد زیر را اجرا کنید :

کد:
clear all
close all
clc

load wind

حالا به Workspace در نرم افزار متلب نگاه کنید. مشاهده خواهید کرد که چند ماتریس در آن وارد شده است که در میان آنها، x و y و z هم وجود دارند. در واقع با این کدها، اطلاعات مربوط به یک مسئله را به درون  Workspace نرم افزار متلب وارد کرده ایم.
حالا نگاهی به مقادیر موجود در ماتریس های x و y و z بیندازید. با اولین نگاه، متوجه خواهید شد که هم اندازه هستند و در آنها، تنها مختصات مربوط به جهت های x و y و z ذخیره شده است. یعنی مثلا ماتریس x ، یک ماتریس سه بعدی مربوط به مقادیر محور x برای تمام نقاط موجود در فضای سه بعدی مورد نظرمان برای مسئله می باشد.

کدهای زیر را ببینید :

کد:
xmin = min(x(:));
xmax = max(x(:));
ymin = min(y(:));
ymax = max(y(:));
zmin = min(z(:));
zmax = max(z(:));

چون قصد داشته ایم که صفحات ابتدایی و انتهایی در هر جهت را رسم کنیم، باید مختصات ماکزیمم و مینیمم در هر جهت را به دست می آورده ایم (که می شود 6 صفحه، البته 3 تای آنها در پشت سه تای دیگر پنهان می شود).

حالا کد زیر را ببینید :

کد:
wind_speed = sqrt(u.^2 + v.^2 + w.^2);


همان طور که گفتم، اطلاعات مسئله به ما 6 تا ماتریس داده بود، ما اومدیم و از سه ماتریس دیگر، مقادیری را محاسبه کرده و در ماتریس wind_speed قرار داده ایم. اگر این مورد شما رو گیج میکنه، اصلا می توانید مقادیر آن را به هر شکل دلخواه قرار بدهید. یعنی کاری به u و v و w نداشته باشید و مقادیر خودتون که پیوست کرده بودید رو به جای wind_speed در نظر بگیرید (البته باید ماتریس های x و y و z متناسب برای مسئله خود را بسازید). اسم نادرستی رو هم برای مقادیرتون انتخاب کرده بودید (گذاشته بودید Z) که باعث می شود آن را با مقادیر محور Z اشتباه بگیرید. اسم ماتریس مقادیر خود را تغییر بدهید. 
این هم، دو خط مربوط به رسم نهایی صفحه ها :

کد:
hsurfaces = slice(x,y,z,wind_speed,[xmin,xmax],[ymin,ymax],[zmax,zmin]);
set(hsurfaces,'FaceColor','interp','EdgeColor','none')

همان طور که مشاهده می کنید، مقادیر مربوط به مختصات صفحه ها را درون پرانتز دستور slice نوشته ایم. همچنین، یک بار کدها را بدون خط آخر، اجرا کنید (یک شکل دقیق را به شما می دهد).

bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط شماره مجازی امارات ، تلگرام ضد فیلتر 2023


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان