替换字符串的几个不同字符

时间:2014-01-29 23:39:54

标签: matlab text-processing

我必须编写一个函数来用这些字母替换字符串的字符。

    A=U
T=A
G=C
C=G

示例:

     Input: 'ATAGTACCGGTTA'

因此,输出应为:

    'UAUCAUGGCCAAU'

我只能替换一个角色。但是,我没有怎么办。如果'“G = C和C = G”我可以替换几个,这个条件不存在。 我用:

    in='ATAGTACCGGTTA'
check=in=='A'
in(check)='U'
ans='UTUGTUCCGGTTU'

如果我在某个时刻继续这样做,G将被C替换,那么所有的C将被G替换。我怎么能阻止这个?任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:4)

只是为了好玩,这可能是绝对最简单的方式,通过索引:

key = 'UGCA';
[~, ~, idx] = unique(in);
out = key(idx');   % transpose idx since unique() returns a column vector

我喜欢索引:D

编辑:正如所指出的,这是针对所述的问题进行了优化。由于[a, ~, idx] = unique(in);返回aidxa(idx) == in,默认a已排序,我们可以假设a == 'ACGT'并预先构造key以将索引转换为a

如果已知字母表中的某些字符从未出现在输入字符串中,或​​者出现其他未知字符,则索引不匹配且假设中断。在这种情况下,我们必须明确地计算适当的密钥 - 填写上面优化的步骤:

alph = 'ACGT';
trans = 'UGCA';
[key, ~, idx] = unique(in);
[~, alphidx, keyidx] = intersect(alph, key);  % find which elements of alph
                                              % appear at which points in key
key(keyidx) = trans(alphidx);   % translate the elements of key that we can
out = key(idx');

答案 1 :(得分:2)

最简单的方法是使用中间字母。例如:

in='ATAGTACCGGTTA'
in(in == 'A')='U'
in(in == 'T')='A'
in(in == 'C')='X'
in(in == 'G')='C'
in(in == 'X')='G'

这样就可以将'C'和'G'字符分开。

编辑:

正如其他人所提到的,你可以采取一些其他措施来改进这种方法(尽管我个人认为Notlikethat的方式是最干净的)。例如,如果您使用第二个变量,则不必担心将“C”和“G”分开:

in='ATAGTACCGGTTA'
out=in;
out(in == 'A')='U';
out(in == 'T')='A';
out(in == 'C')='G';
out(in == 'G')='C';

或者,您可以先将索引设为索引,然后在以下索引:

in='ATAGTACCGGTTA'
inA=in=='A';
inT=in=='T';
inC=in=='C';
inG=in=='G';
in(inA)='U';
in(inT)='A';
in(inC)='G';
in(inG)='C';

最后,我个人最喜欢白痴:

out=char(in+floor((68-in).*(in<70)*7/4)*4-round(ceil((in-67)/4)*3.7));

(说真的,最后一个有效)

答案 2 :(得分:2)

您可以使用bsxfun执行多个字符翻译。

输入:

in = 'ATAGTACCGGTTA';
pat = ['A','T','G','C'];
subst = ['U','A','C','G'];
out0  ='UAUCAUGGCCAAU';

同时翻译所有字符

>> ii = (1:numel(pat))*bsxfun(@eq,in,pat.'); %' instead of repmat and .*
>> out = subst(ii)
out =
UAUCAUGGCCAAU
>> isequal(out,out0)
ans =
     1

假设您只想翻译字符的子集,保留部分序列完整,可以通过逻辑索引和一些额外的行轻松解决:

% Leave the Gs and Cs in place
pat = ['A','T'];
subst = ['U','A'];

ii = (1:numel(pat))*bsxfun(@eq,in,pat.'); %' same
out = char(zeros(1,numel(in)));
nz = ii>0;
out(nz) = subst(ii(nz));
out(~nz) = in(~nz)

out =

UAUGAUCCGGAAU

原始GsCs不变; A成为UT成为AT已消失。)

答案 3 :(得分:1)

我建议使用containter.Map:

m=containers.Map({'A','T','G','C'},{'U','A','C','G'})
mapfkt=@(input)(cell2mat(m.values(num2cell(input))))

用法:

mapfkt('ATAGTACCGGTTA')

答案 4 :(得分:0)

这是另一种方法,它应该是相当有效的,一般的,并且符合你最初的尝试:

%Suppose this is your input
myString = 'abcdeabcde';
fromSting = 'ace';
toString = 'xyz';

%Then it just takes this:
[idx fromLocation] = ismember(myString,fromSting)
myString(idx)=toString(fromLocation(idx))

如果您知道所有字母都需要更换,最后一行可以略微简化,因为您不需要使用idx