How to convert arrayfun to for loop

I found a source code online for a vigenere cipher and was wondering how to convert it to a for loop.
function Array = Operator
count = 27; %Primary function of the vignere encryptions by creating a 27x27 array
Length = 1:count; %array of length 27
% ie, Create a matrix with 27 shifted substitution alphabets
% 1 2 3 4 5 ... 26 27
% 2 3 4 5 6 ... 27 1
% 3 4 5 6 7 ... 1 2
% etc.
Array = arrayfun(@(n) circshift(Length, [0, -n]), 0:count-1, ...
'UniformOutput', false);
Array = reshape([Array{:}], count, count);
end
function cipher_text = vigenere_cipher(origionalText,key)
Array = Operator;
key = lower(key) - double('a') + 1; %Converts all text to lowercase
key(key < 0) = 27;
origionalText = lower(origionalText) - double('a') + 1;
origionalText(origionalText < 0) = 27;
keyLength = rem(0:(numel(origionalText)-1), numel(key))+1; %Converst the key to the length of the origional text
k = key(keyLength);
% Encrypt: C(n) = V(k(n), plaintext(n))
cipher_text = arrayfun(@(m,n) Array(m,n), k, origionalText) - 1;
cipher_text(cipher_text == 26) = double(' ') - double('a');
cipher_text = upper(char(cipher_text + double('a')));
end

 Respuesta aceptada

Thorsten
Thorsten el 7 de Sept. de 2016
count = 27;
Length = 1:count;
for n = 0:count-1
Array(n+1,:) = circshift(Length, [0, -n]);
end

5 comentarios

Zachary Holmes
Zachary Holmes el 7 de Sept. de 2016
Your output is slightly wrong. Attackatdawn with the key lemon outputs LXEOPVEERNGR, where its meant to be LXFOPVEFRNHR
Thorsten
Thorsten el 7 de Sept. de 2016
Editada: Thorsten el 7 de Sept. de 2016
Then there is something wrong with your original code, that also outputs LXEOPVEERNGR.
I also checked that Array computed with your original function and my Array are equal.
Zachary Holmes
Zachary Holmes el 7 de Sept. de 2016
That output is different slightly, whit your code, when the letters cross from z to a they seem to be going a letter to far. Ie in yours the letter F is meant to be an E
Zachary Holmes
Zachary Holmes el 7 de Sept. de 2016
All good. i got it working thanks!!
Thorsten
Thorsten el 8 de Sept. de 2016
So if you're happy, please accept my answer.

Iniciar sesión para comentar.

Más respuestas (1)

Andrei Bobrov
Andrei Bobrov el 7 de Sept. de 2016
Editada: Andrei Bobrov el 8 de Sept. de 2016
Array = hankel(1:27,[27,1:26]);
or
count = 27;
L = (1:count)';
Array1 = zeros(count);
for jj = 1:count
Array1(jj,:) = rem(L+jj-2,count)+1;
end
or
Array = hankel(L,circshift(L,[0,1]));

2 comentarios

Zachary Holmes
Zachary Holmes el 7 de Sept. de 2016
I don't want to create a new function, i just want to rewrite
Array = arrayfun(@(n) circshift(Length, [0, -n]), 0:count-1, ... 'UniformOutput', false); Array = reshape([Array{:}], count, count);
that bit of code differently
:)
Array = hankel(1:27,[27,1:26]);

Iniciar sesión para comentar.

Categorías

Etiquetas

Preguntada:

el 7 de Sept. de 2016

Editada:

el 8 de Sept. de 2016

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by