如何在Matlab中拆分单元格1x1?

时间:2017-06-28 12:24:45

标签: matlab matrix cell bioinformatics

假设我有一个带有此值的1x1单元格:'atcatcaaca'。 我的目标是:

  1. 在任何'a'旁边添加1到5'a'。
  2. 在任何'c'旁边添加1到10'c'。
  3. 在任何'g'旁添加随机数'g'。
  4. 在任何't'旁边添加一个随机数't'。

    例如我有'atcatcaaca'。我的目标是让它成为:'aaaattttcccaattttccaaaaaaaaacaccccccccaa'

  5. 我的想法是取值单元格并以某种方式将其拆分为矩阵: a | t | a | t | c | a | a | c |一个。 有可能吗?如果可能的话,怎么样?

    代码是:

    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
    

3 个答案:

答案 0 :(得分:0)

它已经是这样.. 'a string'是一个字符数组,所以为了将它们转换为单元格数组,你需要使用通常的num2cell函数:

>> 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

答案 1 :(得分: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)

请注意,我使用6作为'a'的最大数量,因为strrep将替换原来的a,而不是在你问的旁边添加字母。

编辑:

在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)

答案 2 :(得分: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用于复制字符。