這是一個非常簡單的生物信息學實現的自我對齊矩陣與它使用滑動窗口運算符兩次在字符串序列上循環兩次,並比較相同序列的每個fra2
。 下面的代碼非常慢,不知道如何使用標準R語法加速它。在python中這將會超快,但是在R中需要1分鐘。通過同時分配i,j
和j,i
,我已經將計算減少了一半。 任何加快思路?R函數超慢
sequence = 'MNLDIHCEQLSDARWTELLPLLQQYEVVRLDDCGLTEEHCKDIGSALRANPSLTELCLRTNELGDAGVHLVLQGLQSPTCKIQKLSLQNCSLTEAGCGVLPSTLRSLPTLRELHLSDNPLGDAGLRLLCEGLLDPQCHLEKLQLEYCRLTAASCEPLASVLRATRALKELTVSNNDIGEAGARVLGQGLADSACQLETLRLENCGLTPANCKDLCGIVASQASLRELDLGSNGLGDAGIAELCPGLLSPASRLKTLWLWECDITASGCRDL'
if(!exists('BLOSUM50')){
library(Biostrings)
data(BLOSUM50)
#BLOSUM50['A','N']
}
windowSize<-24;
matrixSize<-nchar(sequence) - windowSize;
defaultValue = -10000000000;
scoreMatrix <- matrix(defaultValue, nrow = matrixSize, ncol = matrixSize);
for(i in 1:matrixSize){
frag1 = substr(sequence,i,i+windowSize);
for(j in 1:matrixSize){
frag2 = substr(sequence,j,j+windowSize);
totalScore = 0;
if(scoreMatrix[i,j] == defaultValue){
for(x in 1:windowSize){
totalScore = totalScore + BLOSUM50[substr(frag1,x,x),substr(frag2,x,x)]/windowSize;
}
scoreMatrix[i,j] = totalScore;
scoreMatrix[j,i] = totalScore;
}
}
}
return(scoreMatrix);
你先檢查子字符串,然後檢查是否已經填充了該變量。嘗試在'if(scoreMatrix ...){'語句中放置'frag2 = ....'。 – JAD
此外,你做兩次子串,首先到'frag1/2',然後再次在最後的for-loop。你可以把它改爲'substr(sequence,i + x-1,i + x-1)'和'substr(sequence,j + x-1,j + x-1)'並保存一些函數調用。 – JAD
你的'frags'的長度是否爲'windowSize + 1',但後來迭代'x'到'windowSize'是否正確? –