การดำเนินการ Bitwise XOR เพื่อแย่งเมทริกซ์อักขระสองตัวโดยการสร้างตารางความจริง

ฉันจำเป็นต้องดำเนินการ XOR สำหรับอักขระสี่ตัวโดยแต่ละตัวมีการแสดงบิตดังนี้:

 A = 00

 G = 01

 C = 10

 T = 11

ฉันต้องสร้างตารางที่มีอักขระสองตัว XORs อยู่ด้วยกัน ซึ่งให้ค่าสำหรับการผสมอักขระคู่ XORing ทั้งหมดในลักษณะต่อไปนี้

  XOR   A  G  C  T

   A    A  G  C  T
   G    G  A  T  C
   C    C  T  A  G
   T    T  C  G  A

ในการรับเอาต์พุต คุณต้องแปลงอักขระแต่ละตัวให้เป็นบิตแทนค่า XOR บิต จากนั้นใช้ผลลัพธ์และแปลงกลับเป็นอักขระที่ถูกต้อง ตัวอย่างเช่น ดูแถวที่สามและคอลัมน์ที่สองของตาราง โดย XORing C และ G:

C = 10
G = 01

C XOR G = 10 XOR 01 = 11 --> T

ในที่สุดฉันต้องการใช้กฎนี้กับอักขระที่แย่งชิงในเมทริกซ์ขนาด 5 x 5 ตัวอย่างเช่น:

A =  'GATT'    'AACT'    'ACAC'    'TTGA'    'GGCT'    
     'GCAC'    'TCAT'    'GTTC'    'GCCT'    'TTTA'    
     'AACG'    'GTTA'    'ACGT'    'CGTC'    'TGGA'    
     'CTAC'    'AAAA'    'GGGC'    'CCCT'    'TCGT'    
     'GTGT'    'GCGG'    'GTTT'    'TTGC'    'ATTA'


B =  'ATAC'    'AAAT'    'AGCT'    'AAGC'    'AAGT'    
     'TAGG'    'AAGT'    'ATGA'    'AAAG'    'AAGA'    
     'TAGC'    'CAGT'    'AGAT'    'GAAG'    'TCGA' 
     'GCTA'    'TTAC'    'GCCA'    'CCCC'    'TTTC'
     'CCAA'    'AGGA'    'GCAG'    'CAGC'    'TAAA'

ฉันต้องการสร้างเมทริกซ์ C เพื่อให้แต่ละองค์ประกอบของ A ได้รับ XORed โดยมีองค์ประกอบที่สอดคล้องกันใน B

ตัวอย่างเช่น เมื่อพิจารณาแถวแรกและคอลัมน์แรก:

A{1,1} XOR B{1,1} = GATT XOR ATAC = GTTG

ฉันจะทำสิ่งนี้กับเมทริกซ์ทั้งหมดได้อย่างไร?


person Abirami Anbalagan    schedule 23.08.2014    source แหล่งที่มา
comment
A=00 ไม่สมเหตุสมผล อาจจะ A='00' หรือ A=[0 0] หรืออย่างอื่น?   -  person Divakar    schedule 23.08.2014
comment
เพื่อเป็นตัวอย่าง คุณช่วยบอกเราได้ไหมว่า xor(A,G) จะเป็นเช่นไร ประเภทเอาต์พุตจะเป็นเช่นไร - อาร์เรย์ของเซลล์หรืออาร์เรย์คู่หรือถ่านก็ได้   -  person Divakar    schedule 23.08.2014
comment
ฉันคิดออกแล้ว โดยพื้นฐานแล้ว ให้แปลงตัวแปรทั้งสองไปเป็นการแสดงบิต xor แต่ละบิตแยกกัน จากนั้นทำการค้นหาแบบย้อนกลับ   -  person rayryeng    schedule 23.08.2014
comment
@Divakar - ฉันคิดว่า OP ต้องการอะไร ฉันได้แก้ไขโพสต์เพื่อให้ชัดเจนยิ่งขึ้น สิ่งนี้ขัดกับนโยบาย SO แต่ท้ายที่สุดนี่คือสิ่งที่ OP ต้องการสื่อสาร... ดังนั้นฉันจึงคิดว่าจะแก้ไขให้ผู้อ่านในอนาคต ดูโพสต์ของฉัน และฉันยินดีรับวิธีแก้ปัญหาที่มีประสิทธิภาพมากกว่านี้หากคุณมี!   -  person rayryeng    schedule 24.08.2014
comment
@rayryeng สุดยอด! คุณเป็นนักจิตวิทยาแถวนี้ (+1 ในการเป็นอย่างนั้น) ;) วิธีแก้ปัญหาของคุณดูดีสำหรับฉัน ด้วยอาร์เรย์เซลล์ จำนวนโซลูชันที่มีประสิทธิภาพก็มีจำกัดอยู่แล้ว   -  person Divakar    schedule 24.08.2014
comment
@Divakar - ฮ่าฮ่าขอบคุณ :) ใช่ฉันไม่ชอบแนวทาง arrayfun / cellfun มากนัก แต่ฉันไม่เห็นวิธีอื่นเลย นี่เป็นปัญหาที่น่าแก้ไข โดยเฉพาะข้อมูลที่ขาดหายไป   -  person rayryeng    schedule 25.08.2014


คำตอบ (1)


ดูเหมือนคุณจะกลับมาอีก!

ขั้นแรก เรามากำหนดฟังก์ชัน letterXOR ที่รับสตริง 4 อักขระสองตัว และ XORs ทั้งสองสตริงที่ตรงกับตารางที่คุณมี เมื่อนึกถึงโพสต์ก่อนหน้าของเรา เรามาตั้งค่าตารางการค้นหาที่มีสองรายการที่ไม่ซ้ำกัน สตริง -bit สอดคล้องกับตัวอักษร เราสามารถใช้คลาส collections.Map เพื่อช่วยเราทำ นี้. นอกจากนี้ เรายังต้องการตารางค้นหา ผกผัน โดยใช้คลาส collections.Map โดยที่ตัวอักษรจะทำให้เราสร้างสตริงขนาด 2 บิต เราจำเป็นต้องทำเช่นนี้ตามที่คุณต้องการแปลงตัวอักษรแต่ละตัวให้เป็นตัวแทนสองบิต และเราจำเป็นต้องมีการค้นหาแบบผกผันเพื่อทำสิ่งนี้ หลังจากนั้น เรา XOR บิตแยกกัน จากนั้นใช้ตารางการค้นหาไปข้างหน้าเพื่อกลับไปยังจุดที่เราเริ่มต้น เช่นนี้:

function [out] = letterXOR(A,B)
    codebook = containers.Map({'00','11','10','01'},{'A','T','G','C'}); %// Lookup
    invCodebook = containers.Map({'A','T','G','C'},{'00','11','10','01'}); %// Inv-lookup
    lettersA = arrayfun(@(x) x, A, 'uni', 0); %// Split up each letter into a cell
    lettersB = arrayfun(@(x) x, B, 'uni', 0);

    valuesA = values(invCodebook, lettersA); %// Obtain the binary bit strings
    valuesB = values(invCodebook, lettersB);

    %// Convert each into a matrix
    valuesAMatrix = cellfun(@(x) double(x) - 48, valuesA, 'uni', 0);
    valuesBMatrix = cellfun(@(x) double(x) - 48, valuesB, 'uni', 0);

    % XOR the bits now
    XORedBits = arrayfun(@(x) bitxor(valuesAMatrix{x}, valuesBMatrix{x}), 1:numel(A), 'uni', 0);

    %// Convert each bit pair into a string
    XORedString = cellfun(@(x) char(x + 48), XORedBits, 'uni', 0);

    %// Access lookup, then concatenate as a string
    out = cellfun(@(x) codebook(x), XORedString);

มาดูโค้ดด้านบนกันช้าๆ อินพุตใน letterXOR คาดว่าจะเป็นอาร์เรย์อักขระของตัวอักษรที่ประกอบด้วย A, T, G และ C ก่อนอื่นเรากำหนดการค้นหาไปข้างหน้าและย้อนกลับ จากนั้นเราจะแบ่งอักขระแต่ละตัวของสตริงอินพุต A และ B ออกเป็นอาร์เรย์เซลล์ของอักขระแต่ละตัว เนื่องจากการมองหาคีย์หลายตัวในสมุดโค้ดของคุณต้องการให้เป็นเช่นนี้ จากนั้นเราจะหาว่าบิตของอักขระแต่ละตัวในแต่ละสตริงคืออะไร บิตเหล่านี้จริงๆ แล้วเป็นสตริง ดังนั้นสิ่งที่เราต้องทำคือแปลงแต่ละสตริงของบิตให้เป็น อาร์เรย์ของตัวเลข เราเพียงแค่แปลงสตริงไปที่ double และลบด้วย 48 ซึ่งเป็นรหัส ASCII สำหรับ 0 เมื่อแปลงเป็น double คุณจะได้ 48 หรือ 49 ซึ่งเป็นสาเหตุที่เราต้องลบด้วย 48

ดังนั้นบิตแต่ละคู่จะถูกแปลงเป็นอาร์เรย์ 1 x 2 ของบิต จากนั้นเราจะนำแต่ละอาร์เรย์ 1 x 2 ของบิตระหว่าง A ถึง B ใช้ bitxor ถึง XOR บิต ผลลัพธ์ ณ จุดนี้ยังคงเป็นอาร์เรย์ 1 x 2 ด้วยเหตุนี้ เราจำเป็นต้องแปลงแต่ละอาร์เรย์ให้เป็นสตริงของบิต จากนั้นใช้ตารางการค้นหาแบบไปข้างหน้าเพื่อค้นหาอักขระที่เทียบเท่ากับบิตเหล่านี้ หลังจากนี้ เราจะเชื่อมอักขระทั้งหมดเข้าด้วยกันเพื่อสร้างสตริงสุดท้ายสำหรับเอาต์พุต


ตรวจสอบให้แน่ใจว่าคุณได้บันทึกข้อมูลข้างต้นไว้ในฟังก์ชันชื่อ letterXOR.m เมื่อเราได้สิ่งนี้แล้ว ตอนนี้เราเพียงแค่ใช้การเรียก cellfun หนึ่งครั้งที่จะ XOR สตริงสี่องค์ประกอบแต่ละตัวในอาร์เรย์เซลล์ของคุณ จากนั้นเราจะส่งออกเมทริกซ์สุดท้ายของเรา เราจะใช้ arrayfun เพื่อดำเนินการดังกล่าว และการป้อนข้อมูลลงใน arrayfun จะ เป็นเมทริกซ์ 5 x 5 ที่กำหนดคอลัมน์หลักไว้ เราทำเช่นนี้เนื่องจาก MATLAB สามารถเข้าถึงองค์ประกอบในอาร์เรย์ 2 มิติโดยใช้ค่าเดียว ค่านี้เป็นดัชนีหลักของคอลัมน์ขององค์ประกอบในเมทริกซ์ เรากำหนดเวกเตอร์ที่เริ่มจาก 1 ถึง 25 จากนั้นใช้ reshape เพื่อให้ได้รูปแบบ 2 มิติที่ถูกต้อง เหตุผลที่เราต้องทำเช่นนี้เพราะเราต้องการให้แน่ใจว่าเมทริกซ์เอาต์พุต (ซึ่งก็คือ C ในตัวอย่างของคุณ) มีโครงสร้างในลักษณะเดียวกัน เช่นนี้:

ind = reshape(1:25, 5, 5); %// Define column major indices
C  = arrayfun(@(x) letterXOR(A{x},B{x}), ind, 'uni', 0); % // Get our output matrix

ผลลัพธ์สุดท้ายของเรา C คือ:

C = 

'GTTG'    'AACA'    'ATCG'    'TTAC'    'GGTA'
'CCGT'    'TCGA'    'GACC'    'GCCC'    'TTCA'
'TATT'    'TTCT'    'ATGA'    'TGTT'    'ATAA'
'TGTC'    'TTAC'    'ATTC'    'AAAG'    'AGCG'
'TGGT'    'GTAG'    'AGTC'    'GTAA'    'TTTA'

ขอให้โชคดี!

person rayryeng    schedule 24.08.2014