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


رتبه موضوع:
  • 1 رای - 4 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

#1
Rainbow 
سلام
من این کد رو برای حذف کردن درصدی از ماتریس داده سه بعدی نوشتم ولی اجرا نمیشه . میشه کمک کنید .
من یک شرط  while  تعیین کردم برای درصدگیری از ماتریس ، البته چون ماتریس سه بعدی است ، یک ماتریس one تعریف کردم که همزمان با صفر شدن ستون های ماتریس اصلی سه بعدی ، همان درایه در ماتریس one صفر میشه و درصدگیری روی ماتریس one  اعمال میشه . درایه ها به صورت تصادفی با دستور randi  تعیین میشن .
ولی با اجرای برنامه خروجی percent رو برابر صفر نمایش میده و انگار اصلا حلقه while رو نمیخونه . داده ها در سایت فورشیر آپلود و در پیوست هستند.


کد:
m=d_x_true;
m_size=size(m);
% Eliminate Random Traces 
delete=30;   % in percent
number_zero=(m_size(2)*m_size(3)*delete)/100;
one=ones(m_size(2),m_size(3));
percent_eliminate=((numel(one)-nnz(one))/(numel(one))*100);
while (percent_eliminate == delete)
    random_x= randi([1,121],1,1);
    random_y=randi([1,121],1,1);
    m_noise(:,random_x,random_y)=0;
    one(random_x,random_y)=0;
    percent_eliminate=((numel(one)-nnz(one))/(numel(one))*100);
end
percent_eliminate

فایل با پسوند mat.  در سایت فورشیر آپلود شده است .
http://www.4shared.com/file/bmNmmHiE/3d_3c_synth.html 
دوست دارم زندگی رو . . . 
پاسخ

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

#2
سلام . 
کداتون به هم ریخته بود ، مجبور شدم کدها رو ویرایش کنم .
شما باید به جای == از =~ استفاده کنی . اصلا حلقه while اجرا نمیشه .
تازه یک مورد مهمتر ، ممکنه percent_eliminate دقیقا برابر 30 نشه . مثلا با توجه به تعداد درایه ها ، بشه 30.1 .
دوست من ، هم کدها و هم ارسال هاتون در این انجمن رو با حوصله بنویسید . تا به مشکل برخوردید سریع اینجا مطرح نکنید بلکه وقت بگذارید و اگر بعد از یکی دو روز به نتیجه نرسیدید بیاید و اینجا مطرح کنید . سود این روش به خودتون میرسه و مطمئنا ما هم از چیزهایی که در رویارویی با این مشکلات یاد میگیرید ، بهره خواهیم برد . 
همیشه هم روشتون رو اول روی ماتریس های کوچک اجرا کنید تا دیدتون باز بشه و کورکورانه با ماتریس های بزرگ کار نکنید وگرنه بهتون قول میدم همه چی هم که درست به نظر بیاد باز هم ممکنه یه جایی رو اشتباه کرده باشید .
موفق باشی دوست عزیز .

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

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

#3
(۱۳۹۲/۰۲/۱۰, ۰۳:۱۵ ب.ظ)'admin' نوشته: سلام . 
کداتون به هم ریخته بود ، مجبور شدم کدها رو ویرایش کنم .
شما باید به جای == از =~ استفاده کنی . اصلا حلقه while اجرا نمیشه .
تازه یک مورد مهمتر ، ممکنه percent_eliminate دقیقا برابر 30 نشه . مثلا با توجه به تعداد درایه ها ، بشه 30.1 .
دوست من ، هم کدها و هم ارسال هاتون در این انجمن رو با حوصله بنویسید . تا به مشکل برخوردید سریع اینجا مطرح نکنید بلکه وقت بگذارید و اگر بعد از یکی دو روز به نتیجه نرسیدید بیاید و اینجا مطرح کنید . سود این روش به خودتون میرسه و مطمئنا ما هم از چیزهایی که در رویارویی با این مشکلات یاد میگیرید ، بهره خواهیم برد . 
همیشه هم روشتون رو اول روی ماتریس های کوچک اجرا کنید تا دیدتون باز بشه و کورکورانه با ماتریس های بزرگ کار نکنید وگرنه بهتون قول میدم همه چی هم که درست به نظر بیاد باز هم ممکنه یه جایی رو اشتباه کرده باشید .
موفق باشی دوست عزیز .

 


 
حرف شما درست ولی وقت من کمه ، از الان تا روز یکشنبه فرصت دارم بعد باید استادم رو ببینم ، و این مشکل یک قسمت از یک برنامه است نه کل مشکل من ، بر اساس اون باید برای 10 تا 90 درصد حذف شدگی ستون ها ،  یک الگوریتم رو چک کنم و رسم کنم و دو الگوریتم دیگه هم باید بنویسم که مقداری با برنامه اول متفاوت هستند و ریاضیات دیگه ای دارند .
دوست دارم زندگی رو . . . 
پاسخ

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

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

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

#5
اینم از کد متلب :

کد:
clear all
close all
clc

delete=4;

A=ones(3,2,3);
A_size=size(A)

deleted_before=zeros(1,2);
deleted_number=0;

while (deleted_number~=delete)
    random_1=randi([1,A_size(2)],1,1);
    random_2=randi([1,A_size(3)],1,1);
    p=0;
    for nn=1:deleted_number
        if ([random_1,random_2]==deleted_before(nn,:))
            p=1;
        end
    end
    if (p==0)
        A(:,random_1,random_2)=0;
        deleted_number=deleted_number+1;
        deleted_before(deleted_number,:)=[random_1,random_2];
    end      
end
A


سه خط اول برنامه که برای عدم تداخل اطلاعات قبلی موجود در نرم افزار متلب است . شما این سه خط یادت نره خیلی مهمه .
ماتریس A یک ماتریس کوچیکه که نتایج رو روی اون تست کردیم . delete تعداد ستون هایی (یا حالا هر اسمی که روش میگذارید) است که باید تبدیل به صفر بشه . 
ماتریس  deleted_before برای اینه که زوج اعداد تصادفی  random_1 و  random_2 که تولید شدن رو ذخیره کنیم که بعدا چک کنیم که تکرار نشده باشن .
حلقه while رو بر اساس  deleted_number می نویسیم که  deleted_number تعداد ستون هایی است که تاکنون (در حلقه) صفر کرده ایم و وقتی برابر delete شود ، حلقه پایان می یابد .
این هم نتیجه اجرای کد متلب بالا :

کد:
A_size =

     3     2     3


A(:,:,1) =

     0     1
     0     1
     0     1


A(:,:,2) =

     0     0
     0     0
     0     0


A(:,:,3) =

     0     1
     0     1
     0     1

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

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

#6
ممنون ادمین جان ، خیلی زحمت کشیدی . من یک خط رو متوجه نمیشم ،


کد:
[deleted_before(deleted_number,:)=[random_1,random_2;
در این خط برای ماتریس 1*2 به نام deleted_before که قبلا با اعدادی مثل 1 و 2 پر شده بود، میخوایم اعداد تصادفی که باهاش ستون یا بعد سوم ماتریس رو صفر کردیم در ماتریس deleted_before جایگذاری کنیم ولی عدد deleted_number از یک بیشتر میشه ، ماتریس سطریه 1*2 است چطور سطر دوم و سوم و .... براش ساخته میشه ؟ فکر کنم باید به جای عدد deleted_number در اینجا باید همون یک رو بذارید تا اعداد تصادفی در ماتریس 1*2 دخیره بشن . نظرتون چیه ؟ 

5 دقیقه بعد : متوجه شدم ، در حلقه while میاید سطرهای 1 تا جایی که اضافه شده رو چک میکنه ولی برام جا نمیفته چطور ماتریسی که 1*2 تعریف شده سطر بهش اضافه میشه ؟
  
دوست دارم زندگی رو . . . 
پاسخ

سوال : صفر کردن درصد مشخصی از عناصر یک ماتریس سه بعدی به صورت رندوم

#7
نقل قول:5 دقیقه بعد : متوجه شدم ، در حلقه while میاید سطرهای 1 تا جایی که اضافه شده رو چک میکنه ولی برام جا نمیفته چطور ماتریسی که 1*2 تعریف شده سطر بهش اضافه میشه ؟ 

وقتی قصد داریم که یک ردیف جدید به ماتریسمون اضافه کنیم ، تنها کافیه که مثلا اگر 10 تا ردیف داره ، کد بنویسیم که مقدارهای ردیف 11 ام این ماتریس را برابر یک سری عدد قرار بدهد . نرم افزار متلب به طور خودکار متوجه می شود که قصد داریم اندازه ماتریس را بزرگ کنیم و بنابراین ابتدا اندازه آن را بزرگ کرده و سپس مقادیر ذکر شده را در آن ردیف قرار می دهد .
اگر در همین مثال ماتریس با 10 ردیف ، مقادیری برای ردیف 12 ام تعریف کنیم، نرم افزار متلب ، دو ردیف به ماتریس اضافه میکنه (ردیف 11 و ردیف 12) . چون مقادیر ردیف 12 مشخص شده ، آنها را در ردیف 12 قرار می دهد ولی چون برای ردیف 11 هیچ چیز تعریف نشده ، آنها را برابر صفر می گیرد . 
deleted_before شامل زوج مقادیر انتخاب تصادفی ستون ها است که در روند حلقه ، به تعداد ردیف های آن اضافه می شود و deleted_number تعداد ستون های صفر شده است که تنها یک عدد اسکالر می باشد و هر بار یک واحد به آن افزوده می شود . 
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط 4i469x ، شماره مجازی امارات


پرش به انجمن:


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