سلام.
می توانید ترکیبی از دستورهای nchoosek و perms در متلب (MATLAB) را به کار ببرید.
دستور nchoosek ، کلیه زیرمجموعه های (subset) دارای n عضو از یک مجموعه (set) را به ما می دهد و البته ترتیب عضوهای مجموعه در آن مهم نیست، یعنی عضوها را جابجا نمی کند و مجموعه دارای عضوهای تکراری (با تغییر چیدمان) را در نتایج نمی آورد (در صورتی که جابجایی عضوها برای ما مهم است و بنابراین در مرحله بعد، از دستور perms کمک خواهیم گرفت).
دستور perms ، کلیه چیدمان های ممکن برای اعداد داده شده به آن را در خروجی به ما می دهد.
بنابراین ما در برنامه ای که می نویسیم، ابتدا از دستور nchoosek برای به دست اوردن کلیه ترکیب های ممکن از اعداد به عنوان زیرمجموعه استفاده می کنیم و سپس از ماتریس نتیجه شده، در یک حلقه for ، ردیف های آن را خوانده (هر ردیف، یک زیرمجموعه است) و از دستور perms برای به دست آوردن کلیه چیدمان های ممکن برای آن ردیف (row)، استفاده می کنیم و این نتایج را هم در یک ماتریس جدید ذخیره می نماییم.
بنده کد زیر را نوشتم، ولی خود شما نیز صحت آن را بررسی نمایید (البته شاید خود متلب دستور خاصی برای این منظور داشته باشد، ولی چون با کمی جستجو، موردی پیدا نکردم، ترجیح دادم که کد زیر را بنویسم) :
کد پیاچپی:
clear all
close all
clc
A = [6,4,2]
B = nchoosek(A,2)
B_size = size(B)
D = [];
for nn=1:B_size(1) % loop for rows
B_row = B(nn,:);
C = perms(B_row);
D = [D ; C];
end
D
3 خط اول کدها برای عدم تداخل برنامه فعلی با برنامه های قبلی اجرا شده در متلب (MATLAB) می باشد.
دستور size ، اندازه ماتریس را بر می گرداند.
نتیجه اجرای کد متلب (MATLAB) بالا :
کد پیاچپی:
A =
6 4 2
B =
6 4
6 2
4 2
B_size =
3 2
D =
4 6
6 4
2 6
6 2
2 4
4 2
قبلی برای زیرمجموعه های 2 عضوی بود، این بار برای زیرمجموعه های 3 عضوی کد را اجرا می کنیم :
کد پیاچپی:
clear all
close all
clc
A = [6,4,2]
B = nchoosek(A,3)
B_size = size(B)
D = [];
for nn=1:B_size(1) % loop for rows
B_row = B(nn,:);
C = perms(B_row);
D = [D ; C];
end
D
نتیجه اجرای کد متلب (MATLAB) بالا :
کد پیاچپی:
A =
6 4 2
B =
6 4 2
B_size =
1 3
D =
2 4 6
2 6 4
4 2 6
4 6 2
6 4 2
6 2 4