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


رتبه موضوع:
  • 1 رای - 3 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
حلقه for

حلقه for

#1
سلام
می خواستم با دستور for یه حلقه برای این فرمول بنویسم

کد:
z t=r*(x t)+(1-r)*(z t-1)

و t= 1 ta m تی در اینجا اندیس است وx یک ماتریس p*m میباشد و x t به ازای 1 تاm افراز ستونی ماتریس ایکس است .z t حالت حلقه دارد ابتدا z1 را بدست می اوریم سپس دوباره در فرمول جای گذاری کرده z2 و به ترتیب تا zm و در اخر یک ماتریس ستونی از z ها به ما میدهد.
خودم تا حددی برنامه را نوشته ام اما جواب نمی دهد

کد:
x=[12 43 34;75 54 64]
r=.2
[p,m]=size(x)
y=mean(x')
z(0)=y'
for t=1:m
    z(t)=r*x(1: p,t)+(1-r)*z(t-1);
end;

ممنون میشم اگه کمک کنید
پاسخ

حلقه for

#2
سلام.
کدهای متلب زیر رو می نویسیم :

کد:
clear all
close all
clc

x=[12 43 34;75 54 64];
x_number=numel(x);
r=0.2;
z_0=0;

z=x;
for t=1:x_number
    if (t==1)
        z(t)=r*x(t)+(1-r)*z_0;
    else
        z(t)=r*x(t)+(1-r)*z(t-1);
    end
end;
z

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

کد:
z =

    2.4000   22.1360   29.6070
   16.9200   28.5088   36.4856

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

حلقه for

#3
مرسی متشکر
پاسخ

حلقه for

#4
فقط تنها مشکل این است که z_0 باید میانگین ماتریس x باشد.یه مثال میزنم براتون
دو متقیر در از یه کالایی در حال اندازه گیرین و به تعداد 3 بار اندازه گیری میشن به صورت ماتریس زیر مینویسیم
x=[12 32 32;43 12 43 ]
حالا بر حسب ابن فرمول z(t)=r*x(1: p,t)+(1-r)*z(t-1 میخواهیم z(t) ها را بدست بیاوریم به شرط اینکه z(0) برابر با میانگین ماتریس x یاشد.
و میانگین x برابر است با mean(x)=[mean motaghayer aval;mean motaghayer dovom]

در کالای اول مقدار در متغیر برابر با{12:43} برای کالای دوم {32:12} و سوم {32:43} و میانگینش برابر مقدار پایین به صورت ستونی است
25.3333
32.6667
پاسخ

حلقه for

#5
دو نوع میانگین گیری رو در زیر براتون مثال زدم :

کد:
clear all
close all
clc

x=[1 2;3 4]
x_mean_1=mean(x)
x_mean_2=mean2(x)

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

کد:
x =

     1     2
     3     4


x_mean_1 =

     2     3


x_mean_2 =

    2.5000

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

حلقه for

#6
بازم سلام.چند تا مشکل عمده هنوزم هست
1-باز هم با در نظر گرفتن کدهایی که شما نوشتید زمانی که میانگین جای گذازی میشود به جای z_0 برنامه erro میدهد
2-طبق برنامه شما z=x گرفته شده در صورتی که طبق فرمولی که به شما گفتم x1 برابر با ستون اول ماتریس x و x2 برابر با ستون دوم و الی آخر
پاسخ

حلقه for

#7
(۱۳۹۲/۰۵/۱۹, ۰۲:۰۸ ق.ظ)masood نوشته: بازم سلام.چند تا مشکل عمده هنوزم هست
1-باز هم با در نظر گرفتن کدهایی که شما نوشتید زمانی که میانگین جای گذازی میشود به جای z_0 برنامه erro میدهد
2-طبق برنامه شما z=x گرفته شده در صورتی که طبق فرمولی که به شما گفتم x1 برابر با ستون اول ماتریس x و x2 برابر با ستون دوم و الی آخر

اینم کدهای جدید :

کد:
clear all
close all
clc

x=[12 43 34;75 54 64];
x_size=size(x);
r=0.2;

z=zeros(1,x_size(2));
for m=1:x_size(2)
    for t=1:x_size(1)
        z_0=sum(x(:,m))/x_size(1);
        if (t==1)
            z(t,m)=r*x(t,m)+(1-r)*z_0;
        else
            z(t,m)=r*x(t,m)+(1-r)*z(t-1,m);
        end
    end;
end
z

نتیجه اجرا :

کد:
z =

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


پرش به انجمن:


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