Created
June 15, 2016 16:03
-
-
Save lmendo/e9965b5c8b661b928984f73bda6b550c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function Z = base2base(varargin) | |
% Three inputs: origin array, origin base, target base | |
% If a base is specified by a number, say b, the digits are [0,1,...,d-1]. | |
% The base can also be directly an array with the digits | |
% Fourth input, optional: how many digits the output should have as a | |
% minimum (padding with leading zeros, i.e with the first digit) | |
% Non-valid digits in origin array are discarded. | |
% It works with cell arrays. In this case it gives a matriz in which each | |
% row is padded with leading zeros if needed | |
% If the base is specified as a number, digits are numbers, not | |
% characters as in `dec2base` and `base2dec` | |
ic = iscell(varargin{1}); | |
if ~ic, varargin{1} = varargin(1); end | |
if numel(varargin{2})>1, ax = varargin{2}; bx=numel(ax); else bx = varargin{2}; ax = 0:bx-1; end | |
if numel(varargin{3})>1, az = varargin{3}; bz=numel(az); else bz = varargin{3}; az = 0:bz-1; end | |
Z = cell(size(varargin{1})); | |
for c = 1:numel(varargin{1}) | |
x = varargin{1}{c}; [valid, x] = ismember(x,ax); x = x(valid)-1; | |
if ~isempty(x) | |
z = NaN(1,ceil(numel(x)*log2(bx)/log2(bz))); done_outer = false; | |
n = 0; | |
while ~done_outer | |
n = n +1; | |
x = [0 x(find(x,1):end)]; | |
y = NaN(size(x)); done_inner = false; | |
m = 0; | |
while ~done_inner | |
m = m + 1; | |
t = x(1)*bx+x(2); | |
r = mod(t, bz); q = (t-r)/bz; | |
y(m) = q; x = [r x(3:end)]; | |
done_inner = numel(x) < 2; | |
end | |
y = y(1:m); | |
z(n) = r; x = y; done_outer = ~any(x); | |
end | |
z = z(n:-1:1); | |
if numel(varargin)>=4 && numel(z)<varargin{4}, z = [zeros(1,varargin{4}-numel(z)) z]; end | |
z = az(z+1); | |
Z{c} = z; | |
end | |
end | |
if ~ic, Z = Z{1}; | |
else | |
L = max(cellfun(@numel, Z)); | |
Z = cellfun(@(x) [zeros(1, L-numel(x)) x], Z, 'uniformoutput', false); | |
Z = vertcat(Z{:}); | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment