2016-05-24 5 views
1

私は、出力形式順列次ていると仮定します - :どのように制約に従って順列の特定の行を削除するには?

1 2 4 7 9 10 
1 2 4 5 6 8 

- 私は7.最終的な答えをする必要があります前に、9または5またはその両方が来ている行を削除したい

A= 1 2 4 7 9 10 
    1 3 4 9 7 8 
    1 2 9 4 7 10 
    1 2 4 5 6 8 
    1 2 3 5 7 9 
    1 2 5 6 7 9 

をそれはできますか?ここ

+2

親愛なるルーシー、[多かれ少なかれ同じ問題を再版](http://stackoverflow.com/questions/37242533/is-there-any-way-to-do-permutation-of-more-than -11-コンポーネント)は、特にあなたのユースケースが依然として明確でないときではなく、特に答えを得るのに役立ちません。私はまだ、実際に問題に近づいているあなたの方法が、可能な数の順列の階乗的成長のため、実際には最良の方法であると確信しています。この多くの順列は論文の締め切り前に計算されないので、別の方法を見つけることでよりうまくいくでしょう。 – Adriaan

答えて

2

が一般的なアプローチだ:7の両方がそれを格納する前に来ている場合はAの任意のサイズのために仕事に

A = [1 2 4 7 9 10 
    1 3 4 9 7 8 
    1 2 9 4 7 10 
    1 2 4 5 6 8 
    1 2 3 5 7 9 
    1 2 5 6 7 9]; % data 
v = 7; % values "after" 
w = [5 9]; % values "before" 
ind = any(ismember(A,v), 2) & any(ismember(A,w), 2); % rows that qualify 
[~, indv] = max(ismember(A(ind,:),v), [], 2); % col index of "after" values 
[~, indw] = max(ismember(A(ind,:),w), [], 2); % col index of "before" values 
remove = indw<indv; % these should be removed, among those given by ind 
ind = find(ind); 
A(ind(remove),:) = []; % remove 
0

このコードは、それは7,5及び9の各列のインデックスをチェックし、それらを比較上記数値のいずれかの行に

A= [1 2 4 7 9 10 
1 3 4 9 7 8 
1 2 9 4 7 10 
1 2 4 5 6 8 
1 2 3 5 7 9 
1 2 5 6 7 9] 
[row,col] = size(A); 
n = 1; 
for i = 1:row 
    sev_index = find(A(i,:) == 7);if(isempty(sev_index))sev_index = 0;end 
    fiv_index = find(A(i,:) == 5);if(isempty(fiv_index))fiv_index = col + 1;end 
    nine_index = find(A(i,:) == 9);if(isempty(nine_index))nine_index = col + 1;end 
    if(sev_index < fiv_index && sev_index < nine_index) 
     y(n,:) = A(i,:) 
     n = n + 1; 
    end 
end 

Y

存在しない場合、Yで、それはまた、出力が

で確認します
y = 

    1  2  4  7  9 10 
    1  2  4  5  6  8 
+1

なぜ賛成投票ですか?何のために ?私は代わりの解決策を与えたから? – johnny

+2

私のdownvoteではありませんが、必要ではないループを使用しているため、4行のifs(読み込みとデバッグが難しい)があるためです。一般的に、この回答には、MATLABで最適ではないと考えられるコードが含まれています。それを上書きすることは、そのような練習をさらに促進するでしょう。 –

関連する問題