2016-12-21 1 views
-4

У меня есть последовательность ДНК, ее длина, например, является м * 4n:Как я могу найти дополнение к подмножеству последовательности ДНК с использованием логического индекса?

B = 'GATTAACTACACTTGAGGCT...'; 

Я также вектор действительных чисел Х = {х, г = 1..m * 4n}, и использовать mod(X,1) для сохранения их в диапазоне [0,1]. Например:

X = [0.223 0.33 0.71 0.44 0.91 0.32 0.11 ....... m*4n]; 

Я тогда нужно преобразовать X в бинарный вектор, применяя функцию:

f(x)={0 ,0 < X(i,j) ≤ 0.5; 1 ,0.5 < X(i,j) ≤ 1;) 

Выходной сигнал в соответствии с предыдущими значениями будет как X = [0010100 ....]. Если X(i,j)==1, то B(i,j) дополняется, в противном случае оно не изменяется. В этом контексте дополнением является совпадающая базовая пара (т. Е. A-> T, C-> G, G-> C и T-> A).

Это код, который я пытался до сих пор не имели успеха:

%%maping X chaotic sequence from real numbers to binary sequence using threshold function 
X = v(:,3); 
X(257)=[]; 
disp (X); 
mode (X,1); 
for i=1 
    for j=1:256 
if ((X(i,j)> 0) && (X(i,j)<= .5)) 
    X(i,j) = 0; 
elseif ((X(i,j)> .5) && (X(i,j)<= 1)) 
    X(i,j) = 1; 
end 
    end 
end 
disp(X); 

Как правильно выполнять индексацию и дополнения?

+2

Вам нужно быть более конкретным, я даже не вижу, как [обработка изображений] входит в это, и я не знаю, чего вы хотите. И даже тогда никто не напишет ваш код для вас, поэтому вам понадобится рабочий/нерабочий пример, о котором вы задаете вопрос. В противном случае ваш вопрос слишком широк. –

+3

Я присоединяюсь к комментарию Андраса. Пожалуйста, по крайней мере, покажите небольшой числовой пример того, что вы пытаетесь сделать. Мне совершенно непонятно, что вы спрашиваете. –

+0

@ AndrasDeak, сэр, я определенно попытался написать это сам, и когда я потерпел неудачу, я пришел сюда, чтобы попросить экспертов в этой области помочь мне в этой конкретной части. это крошечная часть от всей моей программы. спасибо за помощь –

ответ

1

Учитывая пример последовательности пар оснований хранится в виде массива символов:

B = 'GATTAACT'; 

и вектор выборки числовых значений такой же длины, как B:

X = [0.223 0.33 0.71 0.44 0.91 0.32 0.11 1.6]; 

Тогда существует довольно простой решение ...

Во-первых, использование вами функции mod означает, что вы хотите использовать только дробную часть каждого значения e в X. Это, как вы пустошь сделать:

>> X = mod(X, 1) 
X = 
    0.2230 0.3300 0.7100 0.4400 0.9100 0.3200 0.1100 0.6000 

Далее, вы должны дать documentation on vectorization чтения. Это научит вас, что цикл цикла можно избежать для многих операций в MATLAB. В частности, применяя логический тест на свой вектор X можно сделать так:

>> index = (X > 0.5) 
index = 
    0 0 1 0 1 0 0 1 

И index теперь logical index такой же длины, как X с единицами (т.е. истинной) для каждого значения больше чем 0,5. Теперь вы хотите получить символы, соответствующие этим индексам, в B, замените их на их дополнение, затем поместите их обратно в B. Вы можете сделать это, используя небольшой трюк в MATLAB, посредством которого символ преобразуется в ASCII числовое значение, когда использовали в качестве индекса:

>> compMap = ''; % Initialize to an empty string 
>> compMap('ACGT') = 'TGCA' 
compMap = 
                   T G C   A 

Обратите внимание, что символы 'TGCA' получить помещенного в индексах 65, 67, 71 и 84 compMap (т.е. значения ASCII для 'ACGT'). Остальные - это пробелы.Теперь вы можете заменить индексированных пар оснований с их дополнениями, просто делает это:

>> B(index) = compMap(B(index)) 
B = 
GAATTACA 

Сведя все это вместе, вот решение:

B = '...';  % Whatever your sequence is 
X = [...];  % Whatever your values are 
compMap = ''; 
compMap('ACGT') = 'TGCA';  % Build a complement map 
index = (mod(X, 1) > 0.5);  % Get your logical index 
B(index) = compMap(B(index)); % Replace with complements 
+0

спасибо, сэр за ваш ответ .. что я должен изменить, если я хочу применить это на целой матрице (если B была матрицей, а не подмножеством последовательности ДНК) @gnovice –

+0

@MAFathy: Если 'X' - это матрица, которая имеет тот же точный размер, что и' B', тогда код выше будет работать, никаких изменений не потребуется. – gnovice

+0

Фактически, X не такой же точный размер, как B ... его размер 256 * 1 ,,, как я могу сделать свой размер 256 * 4 (256), есть ли какое-то решение? Мне нужно взять каждый 4 бит X: например, (1001), чтобы дополнить каждый пиксель B e.g (ACGT) .. примените, что для всей матрицы B ... любая помощь plz! @gnovice –

Смежные вопросы