octave 06 and 08WIP
This commit is contained in:
parent
e9d7aa3900
commit
c3777e550b
15 changed files with 303 additions and 0 deletions
4
1sem/octave/08/alph_entropy.m
Normal file
4
1sem/octave/08/alph_entropy.m
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
function [h] = alph_entropy(P);
|
||||
P = P(P ~= 0);
|
||||
h = -sum(P.*log2(P));
|
||||
endfunction;
|
||||
6
1sem/octave/08/avg_len.m
Normal file
6
1sem/octave/08/avg_len.m
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
## Author: nuark <nuark@DESKTOP-MJTVANB>
|
||||
## Created: 2019-12-08
|
||||
|
||||
function l = avg_len(C, P)
|
||||
l = sum(cellfun(@length, C) .* P);
|
||||
endfunction
|
||||
16
1sem/octave/08/code.txt
Normal file
16
1sem/octave/08/code.txt
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
0000
|
||||
0001
|
||||
0010
|
||||
0011
|
||||
0100
|
||||
0101
|
||||
0110
|
||||
0111
|
||||
1000
|
||||
1001
|
||||
1010
|
||||
1011
|
||||
1100
|
||||
1101
|
||||
1110
|
||||
1111
|
||||
17
1sem/octave/08/decode_msg.m
Normal file
17
1sem/octave/08/decode_msg.m
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
## Author: nuark <nuark@DESKTOP-MJTVANB>
|
||||
## Created: 2019-12-08
|
||||
|
||||
function msg = decode_msg(emsg, code)
|
||||
alph = ['0':'9' 'A':'F'];
|
||||
msg = '';
|
||||
word = '';
|
||||
|
||||
for c = emsg
|
||||
word(end + 1) = c;
|
||||
match = strcmp(code, word);
|
||||
if any(match)
|
||||
msg = strcat(msg, alph(match));
|
||||
word = '';
|
||||
end
|
||||
end
|
||||
end
|
||||
18
1sem/octave/08/encode_msg.m
Normal file
18
1sem/octave/08/encode_msg.m
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
## Author: nuark <nuark@DESKTOP-MJTVANB>
|
||||
## Created: 2019-12-08
|
||||
|
||||
function emsg = encode_msg(msg, code)
|
||||
alph = ['0':'9' 'A':'F'];
|
||||
l_msg = length(msg);
|
||||
|
||||
emsg = '';
|
||||
for i = 1:l_msg
|
||||
mask = alph == msg(i);
|
||||
if any(mask)
|
||||
emsg = strcat(emsg, code(mask));
|
||||
else
|
||||
warning("[WARN] Symbol '%s' (at pos. %d from msg) not found in alphabet", msg(i), i)
|
||||
end
|
||||
end
|
||||
emsg = emsg{1,1};
|
||||
end
|
||||
49
1sem/octave/08/gen_msg.m
Normal file
49
1sem/octave/08/gen_msg.m
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
% Программа генерации случайного сообщения в алфавите, содержащем не более 36 символов: 0, ..., 9, A, ..., Z.
|
||||
% Автор: Кирилл Владимирович Пушкарёв.
|
||||
% Дата: 26 октября 2019 г.
|
||||
% Версия: 0.2
|
||||
% Параметры:
|
||||
% p - вектор, содержащий от 2 до 36 неотрицательных чисел.
|
||||
% Вероятности символов алфавита.
|
||||
% len - целое число.
|
||||
% Длина сообщения.
|
||||
function msg = gen_msg(p, len)
|
||||
% Создаём вектор символов алфавита 0, ..., 9, A, ..., Z
|
||||
alph = ['0':'9' 'A':'Z'];
|
||||
% Если p не вектор, ошибка
|
||||
if ~isvector(p)
|
||||
error('p must be a vector')
|
||||
end
|
||||
% Если длина вектора p больше длины alph, ошибка
|
||||
if length(p) > length(alph)
|
||||
% Выводим сообщение об ошибке, подставляя в него целые числа (%d) — длины векторов
|
||||
error('p is too long (%d > %d)', length(p), length(alph));
|
||||
end
|
||||
% Если длина вектора p меньше 2, ошибка
|
||||
if length(p) < 2
|
||||
error('p is too short (%d < 2)', length(p));
|
||||
end
|
||||
% Если длина не одно число, ошибка
|
||||
if ~isscalar(len)
|
||||
error('len must be a scalar')
|
||||
end
|
||||
% Если длина меньше 1, ошибка
|
||||
if len < 1
|
||||
error('len is too small (%d < 1)', len)
|
||||
end
|
||||
% Создаём пустую строку для записи сообщения
|
||||
msg = '';
|
||||
% Цикл по i от 1 до len
|
||||
for i = 1:len
|
||||
% Заносим случайно выбранный с заданными вероятностями символ в msg
|
||||
msg(i) = alph(rand_discr(p));
|
||||
end
|
||||
end
|
||||
|
||||
% Функция генерации целого случайного числа i с вероятностью p(i).
|
||||
% Параметры:
|
||||
% p - вектор неотрицательных чисел, сумма элементов которого равна 1.
|
||||
% Вероятности.
|
||||
function r = rand_discr(p)
|
||||
r = sum(cumsum(p) < rand()) + 1;
|
||||
end
|
||||
1
1sem/octave/08/hex.txt
Normal file
1
1sem/octave/08/hex.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
4.80000000e+01 4.90000000e+01 5.00000000e+01 5.10000000e+01 5.20000000e+01 5.30000000e+01 5.40000000e+01 5.50000000e+01 5.60000000e+01 5.70000000e+01 6.50000000e+01 6.60000000e+01 6.70000000e+01 6.80000000e+01 6.90000000e+01 7.00000000e+01
|
||||
31
1sem/octave/08/main.m
Normal file
31
1sem/octave/08/main.m
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
#stage 6
|
||||
V=33;
|
||||
rand("state", V);
|
||||
|
||||
#stage 7
|
||||
alph = char([48:57 65:70]);
|
||||
save -ascii "hex.txt" alph;
|
||||
|
||||
#stage 8
|
||||
code = arrayfun(@(n)dec2bin(n, 4), 0:15, "UniformOutput", false);
|
||||
dlmwrite('code.txt', char(code), '');
|
||||
|
||||
#stage 9
|
||||
r = rand(1, 16);
|
||||
ralph = r./sum(r);
|
||||
for i = 1:100
|
||||
msg = gen_msg(ralph, 10);
|
||||
encoded = encode_msg(msg, code);
|
||||
decoded = decode_msg(encoded, code);
|
||||
if ~strcmp(msg, decoded)
|
||||
error("[ERR] Encoded message '%s' not equal to decoded variant '%s'!", msg, decoded)
|
||||
end
|
||||
end
|
||||
|
||||
a_len = avg_len(code, ralph);
|
||||
min_avg_len = min_bits(length(alph));
|
||||
min_len = min(arrayfun(@length, code));
|
||||
rel_opt = alph_entropy(ralph)/(log2(length(ralph)) * a_len);
|
||||
results = [a_len, min_avg_len, min_len, rel_opt];
|
||||
|
||||
save -ascii "results.txt" results;
|
||||
6
1sem/octave/08/min_bits.m
Normal file
6
1sem/octave/08/min_bits.m
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
## Author: nuark <nuark@DESKTOP-MJTVANB>
|
||||
## Created: 2019-12-08
|
||||
|
||||
function r = min_bits(N)
|
||||
r = ceil(log2(N));
|
||||
endfunction
|
||||
1
1sem/octave/08/results.txt
Normal file
1
1sem/octave/08/results.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
4.00000000e+00 4.00000000e+00 1.00000000e+00 2.44102196e-01
|
||||
Loading…
Add table
Add a link
Reference in a new issue