我必须编写一个函数来用这些字母替换字符串的字符。
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替换。我怎么能阻止这个?任何帮助将不胜感激。
答案 0 :(得分:4)
只是为了好玩,这可能是绝对最简单的方式,通过索引:
key = 'UGCA';
[~, ~, idx] = unique(in);
out = key(idx'); % transpose idx since unique() returns a column vector
我喜欢索引:D
编辑:正如所指出的,这是针对所述的问题进行了优化。由于[a, ~, idx] = unique(in);
返回a
和idx
,a(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
原始Gs
和Cs
不变; A
成为U
,T
成为A
(T
已消失。)
答案 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
。