function [CellLocs,CellLocsVector] = makeCellClusterToroidal(clusterCoeff, Percent, n, varargin) % Function for obtaining a list of clustered locations % ARGS: % clusterCoeff = clustering coefficient for bad cells. Must be between 0 and 1 (inclusive). % 0 for totally diffuse, 1 for totally clustered % Percent = percent of bad cells % n = Size of the sheet % can provide x and y location of seed in Varargin % RETURNS: % CellLocs = Locations of the bad cells in a nxn matrix % CellLocsVector = list of locations in a sub2ind style %Check that our number of bad cells isn't too high if Percent >=1 Percent = 1; end numCells=ceil(Percent*n^2); %Sigmoid transform of cluster coeff increases realism of behaviour %clusterCoeff = 1/(1 + exp(-11*clusterCoeff+4)) + 0.001; %Matrix of bad cell locations %row i col j of badCellLocs == 1 if that cell is bad. 0 otherwise. CellLocs = zeros(n,n); %Populate bad cell locations with numBadCells bad cells. %Note: this loop gets exponentially more inefficient as numBadCells -> n^2 %fprintf('Generating %d cells in %d total cells.\n',numCells,n^2); %tic; %calculate the kernel of the probability function sigma=1/clusterCoeff; [XI,YI]=meshgrid(1:4*n,1:4*n); gCenter=2*n; mu=[2*n 2*n]; GKernel=Gaussian(XI,YI,mu,sigma); clear XI YI; GKernelCenter=GKernel(:,gCenter)>0.1*max(GKernel(:)); GKernelMask=meshgrid(GKernelCenter,GKernelCenter').*meshgrid(GKernelCenter,GKernelCenter')'; GKernelMask=logical(GKernelMask); GKernel=GKernel(GKernelMask); GKernel=reshape(GKernel,nnz(GKernelCenter),nnz(GKernelCenter)); %imagesc(GKernel); %start with random location if nargin>3 xloc=varargin{1}; yloc=varargin{2}; else xloc = ceil(n*rand); yloc = ceil(n*rand); end CellLocs(xloc,yloc) = 1; for k=1:numCells-1 %generate probability dist pDistr=convolve2(CellLocs,GKernel,'wrap',0.1); pDistr(CellLocs==1)=0; pDistr=pDistr/sum(pDistr(:)); %figure(1); %imagesc(pDistr); %Set the cell pVector=cumsum(pDistr(:)); indNewLoc=find(pVector>=rand,1,'first'); [xloc,yloc] = ind2sub([n,n], indNewLoc); CellLocs(xloc,yloc) = 1; end locs=1:n^2; CellLocsVector=locs(reshape(CellLocs>0,n^2,1)); %toc end