В комплекте с кодом MATLAB
Сообщение для декодирования: в файле данных Matlab хранятся 3 вектора данных с именами w1, w2, w3: сообщения. мат. Эти векторы столбцов должны быть предварительно обработаны, а затем рабочие собирают свои данные и вычисляют обратную матрицу. Затем они могут «инвертировать» их строки и передать их своему боссу, который легко преобразует их в текст. За исключением функции предварительной обработки и обратных функций матрицы, весь процесс (сбор сообщений, сбор рабочих инструментов, декодирование, печать и т. Д. c.) Выполняется в основной функции.
Ваша работа: Завершите функции preProcess1, preProcess2, preProcess3 и myInvMod2. В настоящее время основная функция будет выполняться, но вы получите результаты «мусора», потому что упомянутые выше функции неполны.
Что включить: ваша обратная функция матрицы myInvMod2.m и копия или снимок экрана с декодированным сообщением.
Не изменять: любой код в main.m
DO выполняет изменения следующих функций. (В настоящее время они являются скелетами)
• preProcess1.m (предварительная обработка работника # 1). Он возьмет битовый вектор w1 (который состоит из 12 битовых групп), извлечет первые 8 бит из каждых 12 и поместит их в 2D-массив с 8 строками и n столбцами (где n - количество символов).
• preProcess2.m. Он возьмет битовый вектор w2 (который состоит из 20 битовых групп), извлечет 8 битов в позициях 2,4,6,8,10,12,14,16 и поместит их в двумерный массив с 8 строками и n столбцами. (где n - количество символов.)
preProcess3.m. Он возьмет битовый вектор w3 (который находится в 24-битных группах), извлечет 8 битов в позициях 2,3,5,7,11,13,17,19 и поместит их в двумерный массив с 8 строками и n столбцами. (где n - количество символов.)
myInvMod2.m: эта функция возьмет квадратную (0,1) матрицу A и выдаст ее обратную.
main. м
function main()
% DO NOT CHANGE ANY CODE in main function
% Matlab Data File: The Messages are stored
load('messages.mat','w1','w2','w3');
% Matlab Data File: workerMatrices.mat
% Includes 8 x 16 (0,1) matrices
% with variable names A1,A2,A3
load('workerMatrices.mat','A1','A2','A3');
% Matlab Data File: managerTools.mat
% Includes:
% charTable: 65536 symbols (75 unique, with literally thousands of
% ways to make most frequently used leters
% permInv: alphbet descrambler
% pad: 16 bit (0,1) vector
% Manager will "flip" some of the worker bits: v-> v+pad (mod 2)
% Extra layer of security in case "worker" comes into
% possesion of the charactyer table
load('managerTools.mat','permInv','charTable','pad');
% workers concanate their matrics and compute inverses
A12=[A1;A2]; A13=[A1;A3]; A23=[A2;A3];
A12inv = myInvMod2(A12);
A13inv = myInvMod2(A13);
A23inv = myInvMod2(A23);
% workers pre process their personal bit strings
B1=preProcess1(w1);
B2=preProcess2(w2);
B3=preProcess3(w3);
% workers get together to concanetate their processed bit matrices
B12=[B1;B2]; B13=[B1;B3]; B23=[B2;B3];
% de-scramble the bits using the inverse matrix
C12=mod(A12inv*B12,2);
C13=mod(A13inv*B13,2);
C23=mod(A23inv*B23,2);
% Manager Takes Over to take decode
msg12=decodeMsg(C12);
fprintf('\nWorkers 1 & 2:\n'); fprintf(msg12); fprintf('\n\n');
msg13=decodeMsg(C13);
fprintf('Workers 1 & 3:\n'); fprintf(msg13); fprintf('\n\n');
msg23=decodeMsg(C23);
fprintf('Workers 2 & 3:\n'); fprintf(msg23); fprintf('\n\n');
function msg=decodeMsg(C)
n=size(C,2);
powers=2.^(15:(-1):0);
C=mod(C + repmat(pad,1,n),2);
cn = 1 + (powers*C);
cn=permInv(cn);
msg='';
for k=1:n
newChar=charTable{cn(k)};
if strcmp(newChar,'\')
msg=[msg,'\n'];
else
msg=[msg,newChar];
end
end
end
end
preProcess1.m
function B=preProcess1(w)
nChars=length(w)/12;
% w will be (0,1) column vector of length 12*nChars ;
% your job: for every 12 bit string, extract the first 8 bits, and
% store the values into the columns of B
% B: will consist of "nChars" Columns, and 8 rows
B=zeros(8,nChars); % initialize B
B=round(rand(size(B))); % total garbage random answer, altough it has the right size
end
preProcess2.m
function B=preProcess2(w)
nChars=length(w)/20;
% w will be (0,1) column vector of length 20*nChars ;
% your job: for every 20 bit string, extract bits 2,4,6,8,10,12,14,16, and
% store the values into the columns of B
% B: will consist of "nChars" Columns, and 8 rows
B=zeros(8,nChars); % initialize B
B=round(rand(size(B))); % total garbage random answer, altough it has the right size
end
preProcess3.m
function B=preProcess3(w)
nChars=length(w)/24;
% w will be (0,1) column vector of length 24*nChars ;
% your job: for every 24 bit string, extract bits 2,3,5,7,11,13,17,19, and
% store the values into the columns of B
% B: will consist of "nChars" Columns, and 8 rows
B=zeros(8,nChars); % initialize B
B=round(rand(size(B))); % total garbage random answer, altough it has the right size
end
myInvMod2.m
function B=myInvMod2(A)
[nRows,nCols]=size(A);
if (nRows ~= nCols)
error('myInvMod2 accepts Square Matrices Only!');
else
n=nRows; % n= #Rows/Columns
end
B= eye(n); % Wrong answer for inverse. You will provide the right answer
end