ดูเหมือนคุณจะกลับมาอีก!
ขั้นแรก เรามากำหนดฟังก์ชัน letterXOR
ที่รับสตริง 4 อักขระสองตัว และ XOR
s ทั้งสองสตริงที่ตรงกับตารางที่คุณมี เมื่อนึกถึงโพสต์ก่อนหน้าของเรา เรามาตั้งค่าตารางการค้นหาที่มีสองรายการที่ไม่ซ้ำกัน สตริง -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
A=00
ไม่สมเหตุสมผล อาจจะA='00'
หรือA=[0 0]
หรืออย่างอื่น? - person Divakar   schedule 23.08.2014xor(A,G)
จะเป็นเช่นไร ประเภทเอาต์พุตจะเป็นเช่นไร - อาร์เรย์ของเซลล์หรืออาร์เรย์คู่หรือถ่านก็ได้ - person Divakar   schedule 23.08.2014xor
แต่ละบิตแยกกัน จากนั้นทำการค้นหาแบบย้อนกลับ - person rayryeng   schedule 23.08.2014arrayfun / cellfun
มากนัก แต่ฉันไม่เห็นวิธีอื่นเลย นี่เป็นปัญหาที่น่าแก้ไข โดยเฉพาะข้อมูลที่ขาดหายไป - person rayryeng   schedule 25.08.2014