Re: [問題] 排列組合問題已回收
※ 引述《fother (huss)》之銘言:
: 想請問一下 假如輸入a=[1 1 2] 然後要排列組合a
: 用perms(a)後 會出現 2 1 1
: 2 1 1
: 1 2 1
: 1 1 2
: 1 1 2
: 1 2 1
: 可是我不要重複的 像2 1 1就重複出現 我知道可以用 unique(perms(a))
: 可是當a很大的時候 執行perms(a)時已經out memory了 也來不及用 unique了
: 所以是不是還有其他什麼方法判斷出來
: 謝謝各位大大
我的寫法很粗暴 所以會付出很多的computation time
而且也不知道對於真正會讓記憶體爆掉的矩陣來說是否可行
所以如果不適用 先說聲抱歉...
% 基本想法是說把同元素的矩陣分段作排列
% 每次排列就unique一次
% 以降低該矩陣在workspace的容量
% 因為先對整個矩陣perms會出現超大的矩陣
% 所以才有分段的想法...
%% 開始
function output = unique_perms(input)
pressed = unique(input);
pressed_L = length(pressed);
for ii = 1:pressed_L
eval(['blk' num2str(ii)...
' = repmat(pressed(ii),[1 length(find(input == pressed(ii)))]);']);
end
temp1 = blk1;
clear blk1;
for ii = 2:pressed_L
eval(['temp_L = size(temp' num2str(ii-1) ',1);']);
eval(['temp' num2str(ii) ' = [];']);
for jj = 1:temp_L
eval(['target = temp' num2str(ii-1) '(jj,:);']);
eval(['temp' num2str(ii) ' = unique([temp' num2str(ii)...
'; unique(perms([target blk' num2str(ii)...
']),''rows'')],''rows'');']);
end
eval(['clear temp' num2str(ii-1) ' blk' num2str(ii)]);
end
eval(['output = temp' num2str(pressed_L) ';']);
end
%% 收工 請慢用
--
◥◥ ╔═╦═╗ ╔═╗ ╔═══╗
╭──╮╱◥ ║ ║╔══╗╔═╦╗╔═╗╔══╗║ ║
◎ ╰╮ ║ ╣║ ═ ║║ ║║ ║║ ║║ ║
╱ │ ║ ║║ ╣║ ║║ ║║ ║╚╗ ╔╝
▁╱ │ ╚═╩═╝╚══╝╚══╝╚═╝╚═╩╝ ╚═╝
▏ ◎╯ →→→→ http://www.wretch.cc/album/kevint ←←←← By luh4
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.148.130
推
04/13 13:12, , 1F
04/13 13:12, 1F
討論串 (同標題文章)
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章