Operasi Bitwise XOR untuk mengacak dua matriks karakter dengan menghasilkan tabel kebenaran

Saya perlu melakukan operasi XOR untuk empat karakter yang masing-masing memiliki representasi bit sebagai berikut:

 A = 00

 G = 01

 C = 10

 T = 11

Saya perlu membuat tabel yang menggabungkan dua karakter yang memberikan nilai untuk semua kombinasi XORing pasangan karakter dengan cara berikut.

  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

Untuk mendapatkan output, Anda perlu mengubah setiap karakter menjadi representasi bitnya, XOR bitnya, kemudian menggunakan hasilnya dan mengubahnya kembali menjadi karakter yang tepat. Misalnya, melihat baris ketiga dan kolom kedua tabel, dengan XORing C dan G:

C = 10
G = 01

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

Saya akhirnya ingin menerapkan aturan ini untuk mengacak karakter dalam matriks 5 x 5. Sebagai contoh:

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'

Saya ingin membuat matriks C sedemikian rupa sehingga setiap elemen A mendapat XOR dengan elemen terkait di B.

Misalnya, perhatikan baris pertama dan kolom pertama:

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

Bagaimana saya bisa melakukan ini untuk seluruh matriks?


person Abirami Anbalagan    schedule 23.08.2014    source sumber
comment
A=00 tidak masuk akal. Mungkin A='00' atau A=[0 0] atau yang lainnya?   -  person Divakar    schedule 23.08.2014
comment
Sebagai contoh, dapatkah Anda memberi tahu kami apa yang dimaksud dengan xor(A,G)? Apa tipe keluarannya - array sel atau array ganda atau char mungkin?   -  person Divakar    schedule 23.08.2014
comment
Saya menemukan jawabannya. Pada dasarnya, ubah kedua variabel menjadi representasi bitnya, xor masing-masing bit satu per satu, lalu lakukan pencarian terbalik.   -  person rayryeng    schedule 23.08.2014
comment
@Divakar - Saya menemukan apa yang diinginkan OP. Saya telah mengedit postingan untuk membuatnya lebih jelas. Ini bertentangan dengan kebijakan SO, tapi pada akhirnya inilah yang ingin dikomunikasikan oleh OP... jadi saya pikir saya akan mengeditnya untuk pembaca selanjutnya. Lihatlah posting saya, dan saya menyambut solusi yang lebih efisien jika Anda punya!   -  person rayryeng    schedule 24.08.2014
comment
@rayryeng Luar Biasa! Anda adalah mentalis di sini (+1 untuk menjadi seperti itu) ;) Solusi Anda tampaknya bagus bagi saya. Dengan array sel, jumlah solusi efisiennya terbatas.   -  person Divakar    schedule 24.08.2014
comment
@Divakar - ahaha terima kasih :) Ya, saya tidak terlalu menyukai pendekatan arrayfun / cellfun, tapi saya tidak bisa melihat cara lain untuk mengatasinya. Ini adalah masalah yang menyenangkan untuk dipecahkan - terutama jika ada informasi yang hilang.   -  person rayryeng    schedule 25.08.2014


Jawaban (1)


Sepertinya Anda kembali lagi!

Pertama, mari kita definisikan fungsi letterXOR yang mengambil dua string 4 karakter dan XORs kedua string yang sesuai dengan tabel yang Anda miliki. Mengingat postingan kita sebelumnya, mari siapkan tabel pencarian dengan dua yang unik -bit string sesuai dengan huruf. Kita dapat menggunakan kelas collections.Map untuk membantu kita melakukannya ini. Kita juga memerlukan tabel pencarian terbalik menggunakan kelas collections.Map yang diberi huruf, kita menghasilkan string dua bit. Kita perlu melakukan ini karena Anda ingin mengubah setiap huruf menjadi representasi dua bitnya, dan kita memerlukan pencarian terbalik untuk melakukan ini. Setelah itu, kita XOR bit-bit tersebut satu per satu, lalu menggunakan tabel pencarian maju untuk kembali ke awal. Dengan demikian:

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);

Mari kita bahas kode di atas secara perlahan. Input ke letterXOR diharapkan berupa susunan karakter huruf yang terdiri dari A, T, G dan C. Kami pertama-tama mendefinisikan pencarian maju dan mundur. Kami kemudian membagi setiap karakter dari string input A dan B ke dalam array sel karakter individual, karena mencari beberapa kunci di buku kode Anda mengharuskannya seperti ini. Kami kemudian mencari tahu bit untuk setiap karakter di setiap string. Bit-bit ini sebenarnya adalah string, jadi yang perlu kita lakukan adalah mengonversi setiap string bit menjadi array angka. Kita cukup memasukkan string ke double dan menguranginya dengan 48, yang merupakan kode ASCII untuk 0. Dengan mengonversi ke double, Anda akan mendapatkan 48 atau 49, itulah sebabnya kita perlu menguranginya dengan 48.

Dengan demikian, setiap pasangan bit diubah menjadi array bit 1 x 2. Kami kemudian mengambil setiap 1 x 2 array bit antara A dan B, gunakan bitxor ke XOR bit. Output pada saat ini masih berupa array 1 x 2. Oleh karena itu, kita perlu mengonversi setiap array menjadi string bit, lalu menggunakan tabel pencarian maju untuk mencari karakter yang setara dengan bit-bit tersebut. Setelah ini, kami menggabungkan semua karakter untuk membuat string terakhir untuk keluaran.


Pastikan Anda menyimpan yang di atas dalam fungsi bernama letterXOR.m. Setelah kita memiliki ini, kita sekarang hanya perlu menggunakan satu panggilan cellfun yang akan meng-XOR setiap string empat elemen dalam array sel Anda dan kemudian kita menampilkan matriks akhir kita. Kami akan menggunakan arrayfun untuk melakukan itu, dan input ke arrayfun akan menjadi matriks 5 x 5 yang kolom utamanya ditentukan. Kami melakukan ini karena MATLAB dapat mengakses elemen dalam array 2D menggunakan satu nilai. Nilai ini merupakan indeks utama kolom dari elemen dalam matriks. Kita tentukan vektor mulai dari 1 hingga 25, lalu gunakan reshape untuk mengubahnya menjadi bentuk 2D yang tepat. Alasan mengapa kita perlu melakukan ini adalah karena kita ingin memastikan bahwa matriks keluaran (yaitu C dalam contoh Anda) disusun dengan cara yang sama. Dengan demikian:

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

Hasil akhir kami C adalah:

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'

Semoga beruntung!

person rayryeng    schedule 24.08.2014