Sepertinya Anda kembali lagi!
Pertama, mari kita definisikan fungsi letterXOR
yang mengambil dua string 4 karakter dan XOR
s 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
A=00
tidak masuk akal. MungkinA='00'
atauA=[0 0]
atau yang lainnya? - person Divakar   schedule 23.08.2014xor(A,G)
? Apa tipe keluarannya - array sel atau array ganda atau char mungkin? - person Divakar   schedule 23.08.2014xor
masing-masing bit satu per satu, lalu lakukan pencarian terbalik. - person rayryeng   schedule 23.08.2014arrayfun / 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