cosmo singleton neighborhood

function nh = cosmo_singleton_neighborhood(ds)
    % return neighborhood where each feature is only neighbor of itself
    %
    % nh=cosmo_singleton_neighborhood(ds)
    %
    % Input:
    %   ds                      dataset strucut
    %
    % Output:
    %   nh                      neighborhood structure where each feature is
    %                           only neighbor of itself.
    %
    %
    % Example:
    %     % This example shows how to run group analysis with multiple
    %     % comparison correction using a clustering neighborhood defined
    %     % by cosmo_singleton_neighborhood with cosmo_montecarlo_cluster_stat
    %     %
    %     nsubjects=10;
    %     nrois=4;
    %     ds=struct();
    %     ds.a=struct();
    %     ds.fa=struct();
    %     % set random data for 10 participants and 4 ROIs
    %     ds.samples=randn(nsubjects,nrois);
    %     %
    %     % set chunks and targets for one-sample t-test
    %     ds.sa.chunks=(1:nsubjects)';
    %     ds.sa.targets=ones(nsubjects,1);
    %     %
    %     nh=cosmo_singleton_neighborhood(ds);
    %     cosmo_disp(nh);
    %     %|| .origin
    %     %||   .a
    %     %||     struct (empty)
    %     %||   .fa
    %     %||     struct (empty)
    %     %|| .fa
    %     %||   .sizes
    %     %||     [ 1         1         1         1 ]
    %     %|| .a
    %     %||   struct (empty)
    %     %|| .neighbors
    %     %||   { [ 1 ]
    %     %||     [ 2 ]
    %     %||     [ 3 ]
    %     %||     [ 4 ] }
    %     %||
    %     %
    %     opt=struct();
    %     opt.progress=false;
    %     %
    %     % t-test against mean=0
    %     opt.h0_mean=0;
    %     %
    %     % make this a fast example.
    %     % usually one uses opt.niter=1000; even better is opt.niter=10000
    %     opt.niter=10; % use 10000 for publication quality
    %     %
    %     tfce_z_scores=cosmo_montecarlo_cluster_stat(ds,nh,opt);
    %     %
    %     % output contains one z-score per ROI
    %     cosmo_disp(size(tfce_z_scores.samples))
    %     %|| [1, 4]
    %
    %
    % Notes:
    % - this function can be used for ROI group analysis with multiple
    %   comparison correction using cosmo_montecarlo_cluster_stat.
    %   To do so, each column in
    %     ds.samples
    %   should correspond to values in one ROI.
    %

    cosmo_check_dataset(ds);

    nh = struct();
    nh.origin = struct();
    nh.fa = struct();
    nh.a = struct();

    if isfield(ds, 'a')
        a = ds.a;

        nh.a = a;
        nh.origin.a = a;
    end

    if isfield(ds, 'fa')
        fa = ds.fa;

        nh.fa = fa;
        nh.origin.fa = fa;
    end

    nfeatures = size(ds.samples, 2);
    nh.fa.sizes = ones(1, nfeatures);

    nh.neighbors = num2cell((1:nfeatures)');