2017-03-17 6 views
0

私は文字列のセル配列を持っていますが、セル配列の割合でAとBを入れ替える必要があります。たとえば、20%、セルの文字列の総数の30%たとえば、アレイ :文字列のセル配列の2文字を入れ替えます

A_in={ 'ABCDE' 
     'ACD' 
     'ABCDE' 
     'ABCD' 
     'CDE' }; 

今、我々は(2/5配列)における配列の40%のAとBを交換する必要があります。 AとBを含まないいくつかのシーケンスがありますので、それらをスキップして、ABを含むシーケンスを入れ替えます。 Aのピックアップシーケンスはランダムに選択されます。私は誰かが私にこれを行う方法を教えることができる適切な。予想される出力は次のようになります。

A_out={ 'ABCDE' 
      'ACD' 
      'BACDE' 
      'BACD' 
      'CDE' } 

答えて

1

strrep

% Input 
swapStr = 'AB'; 
swapPerc = 0.4; % 40% 

% Get index to swap 
hasPair = find(~cellfun('isempty', regexp(A_in, swapStr))); 
swapIdx = randsample(hasPair, ceil(numel(hasPair) * swapPerc)); 

% Swap char pair 
A_out = A_in; 
A_out(swapIdx) = strrep(A_out(swapIdx), swapStr, fliplr(swapStr)); 
でランダムprecentの randsampleとインデックスとのスワップを取得します。
1

あなたがstrfindを使用することができ、同様に:

A_in={ 'ABCDE'; 
    'ACD'; 
    'ABCDE'; 
    'ABCD'; 
    'CDE' }; 
ABcells = strfind(A_in,'AB'); 
idxs = find(~cellfun(@isempty,ABcells)); 
n = numel(idxs); 
perc = 0.6; 
k = round(n*perc); 
idxs = randsample(idxs,k); 
A_out = A_in; 
A_out(idxs) = cellfun(@(a,idx) [a(1:idx-1) 'BA' a(idx+2:end)],A_in(idxs),ABcells(idxs),'UniformOutput',false); 
関連する問題