PDA

View Full Version : بدست آوردن تمام نمونه های r عضوی از یک جامعه ی n عضوی؟



nadaf.m
چهارشنبه 11 آذر 1394, 23:01 عصر
باسلام

این کار را با دستور nchoosek

انجام دادم و نتیجه ی آن ، تعداد نمونه های بدون جایگشت بود !!
با دستور perms تعداد جایگشت هر نمونه r عضوی که از کد nchoosek بدست می آید، اما باز هم نتایج حاصله کامل نیست چراکه مثلا (1،2) و (2،1) را نتیجه می دهد اما (1،1) و (2،2) را نتیجه نمی دهد!
اگر دستور ترتیب با تکرار را در آمار را داشتیم به نتیجه میرسدم اما متاسفانه من کد ترتیب با تکرار را در متلب نمیشناسم!

لطفا اگر روش دیگری برای این کار وجود دارد ویا کدی در این زمینه می دانید ، ممنون میشوم که راهنمایی کنید؟!
با تشکر

rahnema1
پنج شنبه 12 آذر 1394, 00:53 صبح
سلام

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

function nemooneh(r, n, idx)
if nargin < 3
idx = 1;
end
persistent result;
if isempty(result)
result = zeros(1, r);
end
if idx == r
for i = 1: n
result(idx) = i;
disp(result);
end
else
for i = 1: n
result(idx) = i;
nemooneh(r, n, idx + 1);
end
end
end

این هم نحوه استفاده

r = 3;
n = 5;
nemooneh(r, n)

nadaf.m
پنج شنبه 12 آذر 1394, 13:35 عصر
با سلام
با تشکر از پاسخگویتون.
این برنامه نمونه ای دوتایی از جامعه پنج تایی رو نتیجه میده اما مثلا برای جامعه 5عضوه فقط شامل اعداد یک تا پنج هست در صورتی که ممکنه اعداد من مختلف و درهم باشند.مثلا 1و2و3و4و5 نباشد و مثلا 7و4و6و5و10 باشند
چطور میتونم از این جامعه نمونه های دوتایی بگیرم
با تشکر

rahnema1
پنج شنبه 12 آذر 1394, 20:31 عصر
اون روش سریع که گذاشته بودم درست نبود. که پاک کردم
از همون روش بازگشتی استفاده کنید حالا اگه می خواهید اعداد دیگه چاپ بشن از تابع زیر استفاده کنید

function nemooneh(r, n, population, idx)
if nargin < 4
idx = 1;
end
persistent result;
if isempty(result)
result = zeros(1, r);
end
if idx == r
for i = 1: n
result(idx) = population(i);
disp(result);
end
else
for i = 1: n
result(idx) = population(i);
nemooneh(r, n, population, idx + 1);
end
end
end


نحوه استفاده:

r = 3;
n = 5;
population = [10, 5 ,6 ,4 ,7];
nemooneh(r, n, population)

nadaf.m
پنج شنبه 12 آذر 1394, 23:47 عصر
سلام

میشه بگید idx دقیقا در تابع بیانگر چه چیزی هست؟!
در هنگام ران کردن برنامه خطای زیر رو میده:


error using nemooneh(line 9)
not enough input arguments

به نظرتون مشکل کجاست؟!!

rahnema1
جمعه 13 آذر 1394, 00:09 صبح
یه مشکل وجود داشت که قبلا پست را اصلاح کردم به جای عدد 4 عدد 3 گذاشته بودم که درست شد. لطفا یه بار دیگه برنامه را کپی و اجرا کنید

nadaf.m
جمعه 13 آذر 1394, 11:28 صبح
یه مشکل وجود داشت که قبلا پست را اصلاح کردم به جای عدد 4 عدد 3 گذاشته بودم که درست شد. لطفا یه بار دیگه برنامه را کپی و اجرا کنید
باسلام
ممنونم.درست شد.

اگر امکان داره لطفا این برنامه ای ک نوشتید رو توضیح بدهید..مثلا idx چیکار میکنه.چرا 4 که3 باشه برنامه ران نمیشه.و...

باتشکر

rahnema1
جمعه 13 آذر 1394, 14:57 عصر
می خواستم بعضی آرگومانها مقدار پیشفرض داشته باشه که دیگه کاربر نخواد اونها را وارد کند در نتیجه اگه وارد نگرد با شرط nargin چک می شه و یه مقدار پیشفرض بهش تعلق می گیره
یه روش دیگه نوشتم که نمونه ها را به سرعت ایجاد می کنه

function result = nemooneh(r, n)
A = reshape(repmat(1:n, 1, n ^(r-1)), repmat(n, 1, r));
result = zeros(n^ r, r);
for i = 1:r
result(:, i) = reshape(permute(A, circshift((1:r)', i)), n ^ r, 1);
end
end

این هم نحوه استفاده
:

r = 3;
n = 5;
population = [10, 5 ,6 ,4 ,7];
res =nemooneh(r, n);
population(res)