2017-06-28 23 views
0

私はこの値を持つ1x1セルを持っているとしましょう: 'atcatcaaca'。 私の目標は:Matlabでセル1x1を分割する方法は?

  1. 「a」の横に1から5の「a」を追加します。
  2. 任意の 'c'の横に1〜10 'c'を追加します。
  3. 任意の「g」の横に「g」の乱数を追加します。
  4. 「t」の横に任意の「t」の乱数を追加します。 | :aaaattttcccaattttccaaaaaaaaaacccccccccaa「を

私の考えは値セルを取り、マトリックスに何とかそれを分割することです。例えば

は私が持っている「atcatcaaca'.My目標はそれが好きなようにすることです」 t | | t | c | a | a | c | a。 それは可能でしょうか?もしそうなら、どうですか?

コードは次のとおりです。

filename = fullfile(matlabroot,'virus_nucleotitde2.dat'); 

Z = readtable(filename); 

S = table2cell(Z); 

num_rows = size (Z,1); 
num_cols = size (Z,2); 
for i=1:1:num_rows 
    for j=1:1:num_cols 
    B = S(i,j); 
    a=0; 
    c=0; 
    g=0; 
    t=0; 


B{1} = num2cell(B{1}); 

n = randi(6); % Random number between 1 and 6 
B{1} = strrep(B{1} , 'a' , repmat('a' , 1, n)); 

n = randi(11); % Random number between 1 and 11 
B{1} = strrep(B{1} , 'c' , repmat('c' , 1, n)); 

n = randi(11); 
B{1} = strrep(B{1} , 'g' , repmat('g' , 1, n)); 

n = randi(11); 
B{1} = strrep(B{1} , 't' , repmat('t' , 1, n)); 

    end 

end 

答えて

0

、あなたは中括弧を使用してアクセスすることができますcharがあります:

S = {'ataggatag'}; 
B = S{1}; 
disp(B) 

その後、strrepはあなたの友達です:

n = randi(6); % Random number between 1 and 6 
B = strrep(B , 'a' , repmat('a' , 1, n)); 

n = randi(11); % Random number between 1 and 11 
B = strrep(B , 'c' , repmat('c' , 1, n)); 

n = randi(11); 
B = strrep(B , 'g' , repmat('g' , 1, n)); 

n = randi(11); 
B = strrep(B , 't' , repmat('t' , 1, n)); 

その後

セルに戻します
S{1} = B; 
disp(S) 

strrepは、次のように変更する予定であるため、「a」の最大数を6に設定しました。元のa、あなたが尋ねた通りに手紙を追加しないでください。

EDIT:OPの編集後

、ここにあなたのソリューションがある:あなたの説明ではなく、コードに基づいて

S = {'ataggatag'}; 

num_rows = size (S,1); 
num_cols = size (S,2); 

for i=1:1:num_rows 
    for j=1:1:num_cols 
     n = randi(6); % Random number between 1 and 6 
     S{i,j} = strrep(S{i,j} , 'a' , repmat('a' , 1, n)); 

     n = randi(11); % Random number between 1 and 11 
     S{i,j} = strrep(S{i,j} , 'c' , repmat('c' , 1, n)); 

     n = randi(11); 
     S{i,j} = strrep(S{i,j} , 'g' , repmat('g' , 1, n)); 

     n = randi(11); 
     S{i,j} = strrep(S{i,j} , 't' , repmat('t' , 1, n)); 
    end 

end 

disp(S) 
+0

私はこれを行っています(muコードを見てください)。strrepを使用しているエラー セル要素は文字配列でなければなりません。 bio637(行19)のエラー B {1} = strrep(B {1}、 'a'、repmat( 'a'、1、n)); – Diamadis

+0

変更された投稿では、すべてのB {1}をS {i、j}に置き換えて、Bをすべて削除することができます。 – Zep

+0

私はそれが働いていると思っていますが、黄色い文字で表示されます:bio637(行18) 警告:文字配列または文字列のセル配列 – Diamadis

0

これは、セル配列に変換するために、あなたはいつもnum2cell機能を使用する必要があるので..だから'a string'は、文字の配列で、すでにです:

>> name_in_1x1_cell_array{1} = 'ataggatag' 

name_in_1x1_cell_array = 

    'ataggatag' 

>> name_in_1x1_cell_array{1} = num2cell(name_in_1x1_cell_array{1}) 

name_in_1x1_cell_array = 

    {1x9 cell} 

文字に直接アクセスすることもできます。たとえば、文字列のすべての文字を繰り返して表示することができます。

name = 'some name'; 
for i = 1 : length(name) 
    disp(name(i)); 
end 
セル内
0

機能strrepで、それが動作するよう、これは、単純ですセル配列上にも:

cell_string = {'atcatcaaca'}; 

% add a's 
cell_string = strrep(cell_string, 'a', repmat('a',1,5)); 

% add c's 
cell_string = strrep(cell_string, 'c', repmat('c',1,10)); 

% add t's 
cell_string = strrep(cell_string, 't', repmat('t',1,randi(10))); 

楽しいコードrepmatを使用して文字を複製します。

関連する問題