function [A, D, Lista] = read_dataset_3D()

    fn_anchor = '../datasets/3D_NoNoise_Small_Anchors.txt';
    fn_dist = '../datasets/3D_NoNoise_Small_Distances.txt';
    fn_temp = '../datasets/3D_NoNoise_Small_Temperature.txt';
    mx = 30; my = 20;

%     fn_anchor = '../datasets/3D_NoNoise_Large_Anchors.txt';
%     fn_dist = '../datasets/3D_NoNoise_Large_Distances.txt';
%     fn_temp = '../datasets/3D_NoNoise_Large_Temperature.txt';
%     mx = 90; my = 60;

%     fn_anchor = '../datasets/3D_Noise_Small_Anchors.txt';
%     fn_dist = '../datasets/3D_Noise_Small_Distances.txt';
%     fn_temp = '../datasets/3D_Noise_Small_Temperature.txt';
%     mx = 30; my = 20;

%     fn_anchor = '../datasets/3D_Noise_Large_Anchors.txt';
%     fn_dist = '../datasets/3D_Noise_Large_Distances.txt';
%     fn_temp = '../datasets/3D_Noise_Large_Temperature.txt';
%     mx = 90; my = 60;

    data = readtable(fn_anchor);
    
    A = [data.Var2'; data.Var3'; 0*data.Var3'];

    % numero de ancoras
    na = size(A,2);
    % funcao de altura (topografia)
    h = @(x,y) (800 + 25*cos(4 + 8*x/my) + 50*sin(y/my + 1) + 100*x/mx*y/my)/5280;
    
    for i=1:na
        x = A(1,i); y = A(2,i);
        A(3,i) = h(x,y);
    end
    
    Lista = readtable(fn_temp,'Delimiter',',');
    n = length(Lista.Var2);
    
    % matriz de distancias
    D = zeros(n,n);
    
    data = readtable(fn_dist,'Delimiter',',');
    m = length(data.Var3);
    
    for k=1:m
        istr = data.Var1(k);
        jstr = data.Var2(k);
        dij = data.Var3(k);
        i = find(contains(Lista.Var1,istr));
        j = find(contains(Lista.Var1,jstr));
        D(i,j) = dij;
        D(j,i) = dij;
    end
    
    % completando distancias entre ancoras
    for i=1:na
        for j=i+1:na
            D(i,j) = norm(A(:,i) - A(:,j),2);
            D(j,i) = D(i,j);
        end
    end

end