Reference to non-existent field 'xd'. Kindly help .
    4 views (last 30 days)
  
       Show older comments
    
I am working on a network protocol & I seem to be getting stuck at a point with the error "Reference to non-existent field 'xd'.".
the code I'm working on is as follows : -
clc
clear all;
close all;
%message size in bits 
l=2000;
%field dimensions
xm=300;
ym=300;
%sink = center of the field
sink.x=0.5*xm;
sink.y=0.5*ym;
%number of sensor nodes
n=250;
%probability of a node to be elected cluster head
p=0.1;
%initial energy
Eo=0.5;
ETX=50*0.000000001;
ERX=50*0.000000001;
Eelec=ETX;
%transmit amplifier types
Efs=10e-12;
Emp=0.0013e-12;
%data aggregation energy
EDA=5*0.000000001;
%the maximum number of rounds
rmax=250;
do=sqrt(Efs/Emp);
%optimum number of cluster heads
k=20;
t=0;
Et=0;
for h=1:1
    S(n+1).xd=sink.x;
    S(n+1).yd=sink.y;
    Et=0;
for i=1:1:n
    S(i).xd=rand(1,1)*xm;
    XR(i)=S(i).xd;
    S(i).yd=rand(1,1)*ym;
    YR(i)=S(i).yd;
    %distance between each sensor node & the cluster head
    distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );
    S(i).distance=distance;
    S(i).G=0;
    %initially there are no cluster heads only nodes
    S(i).type='N';
    S(i).E=Eo;
    Et=Et+S(i).E;
    figure(h*10)
      plot(S(i).xd,S(i).yd,'bo');
      text(S(i).xd+1,S(i).yd-0.5,num2str(i));
      hold on;
end
%plotting the cluster head
plot(S(n+1).xd,S(n+1).yd,'o', 'MarkerSize', 12, 'MarkerFaceColor', 'r');
text(S(n+1).xd+1,S(n+1).yd-0.5,num2str(n+1));
hold off ; 
countCHs=0;  %variable, counts the cluster head
cluster=1;  %cluster is initialized as 1
flag_first_dead=0; %flag tells the first node dead
flag_half_dead=0;  %flag tells the 10th node dead
flag_all_dead=0;  %flag tells all nodes dead
first_dead=0;
half_dead=0;
all_dead=0;
allive=n;
%counter for bit transmitted to Bases Station and to Cluster Heads
packets_TO_BS=0;
packets_TO_CH=0;
packets_TO_BS_per_round=0;
for r=0:1:rmax
    r 
    packets_TO_BS_per_round=0;
    %Operations for epochs
    if(mod(r, round(1/p) )==0)
        for i=1:1:n
            %every node is initialized to not belonging to a cluster and
            %having 0 G value in the beginning
            S(i).G=0;
            S(i).cl=0;
        end
    end
    %hold off;
    %Number of dead nodes
    dead=0;
     for i=1:1:n
        %counting the number of nodes with non zero G value
        if (S(i).G > 0)
            t = t + 1;
        end
        %checking if there is a dead node
        if (S(i).E<=0)
            %plotting dead nodes
            plot(S(i).xd,S(i).yd,'red .');            
            dead=dead+1;
            if (dead==1)
              if(flag_first_dead==0)
                  %first dead node useful in calculating the network
                  %lifetime
                 first_dead=r;
                 flag_first_dead=1;
              end
            end
            if(dead==0.5*n)
              if(flag_half_dead==0)
                  half_dead=r;
                  flag_half_dead=1;
              end
            end
            if(dead==n)
              if(flag_all_dead==0)
                  all_dead=r;
                  flag_all_dead=1;
              end
            end
            %hold on;
        end
        if S(i).E>0
            S(i).type='N';
        end
     end
     %plotting the sink/base station
        plot(S(n+1).xd,S(n+1).yd,'x');
        STATISTICS.DEAD(h,r+1)=dead;
        STATISTICS.ALLIVE(h,r+1)=allive-dead;
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   countCHs=0;
    cluster=1;
    for i=1:1:n
        %Cluster Head election process if the node has energy/normal
        %node/alive node
        if(S(i).E>0)
            temp_rand=rand;
            if ( (S(i).G)<=0)
                %new Cluster Head will be elected when G value falls below0
                if ( t < k)
                    if ( t > 0)
                        while (countCHs < t)
                            countCHs = countCHs + 1;
                            packets_TO_BS=packets_TO_BS+1;
                            packets_TO_BS_per_round=packets_TO_BS_per_round+1;
                            PACKETS_TO_BS(r+1)=packets_TO_BS;                   
                            S(i).type='C';%CH election
                            S(i).G=round(1/p)-1;
                            C(cluster).xd=S(i).xd;
                            C(cluster).yd=S(i).yd;
                            plot(S(i).xd,S(i).yd,'dr');
                        end
                        if(t==0 & S(i).type~='C')
                            S(i).G = round(1/p)-1;
                        end
                    %electing k-t cluster heads
                    while(countCHs<k-t)
                        countCHs=countCHs+1;
                        packets_TO_BS=packets_TO_BS+1;
                        packets_TO_BS_per_round=packets_TO_BS_per_round+1;
                        PACKETS_TO_BS(r+1)=packets_TO_BS;                   
                        S(i).type='C';
                        S(i).G=round(1/p)-1;
                        C(cluster).xd=S(i).xd;
                        C(cluster).yd=S(i).yd;
                        plot(S(i).xd,S(i).yd,'dr');
                    end
                    end
                else
                    while(countCHs<t)
                         countCHs=countCHs+1;
                         packets_TO_BS=packets_TO_BS+1;
                         PACKETS_TO_BS(r+1)=packets_TO_BS;            
                         S(i).type='C';
                         S(i).G=round(1/p)-1;
                         plot(S(i).xd,S(i).yd,'dr');%plots cluster heads with red diamonds
                         C(cluster).xd=S(i).xd;
                         C(cluster).yd=S(i).yd;
                         plot(S(i).xd,S(i).yd,'k*');            
                         d=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );
                         C(cluster).distance=d;
                         C(cluster).id=i;
                         X(cluster)=S(i).xd;
                         Y(cluster)=S(i).yd;
                         cluster=cluster+1;
                       end             
                end                         
                    distance=sqrt( (S(i).xd-(S(n+1).xd) )^2 + (S(i).yd-(S(n+1).yd) )^2 );
                    C(cluster).distance=distance;
                    C(cluster).id=i;
                    X(cluster)=S(i).xd;
                    Y(cluster)=S(i).yd;
                    cluster=cluster+1;                    
                    %Calculation of Energy dissipated
                    distance;
                    if (distance>=do)
                        S(i).E=S(i).E- ( (Eelec)*(l) + Emp*l*( distance*distance*distance*distance ));
                    end
                    if (distance<do)
                        S(i).E=S(i).E- ( (Eelec)*(4000)  + Efs*l*( distance * distance ));
                    end
                end
            end     
        end
    end
         STATISTICS.COUNTCHS(h,r+1)=countCHs;
    % or STATISTICS.COUNTCHS(h,r+1)=clster-1;
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %Election of Associated Cluster Head for Normal Nodes
     for i=1:1:n
       if ( S(i).type=='N' && S(i).E>0 )
        if(cluster-1>=1)
       min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );
       min_dis_cluster=0;
         for c=1:1:cluster-1
           temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );
           if ( temp<min_dis )
               min_dis=temp;
               min_dis_cluster=c;
           end
         end
       if(min_dis_cluster~=0)    
            min_dis;
            if (min_dis>=do)
                S(i).E=S(i).E- ( Eelec*(l) + Emp*l*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<do)
                S(i).E=S(i).E- ( Eelec*(l) + Efs*l*( min_dis * min_dis)); 
            end
            S(C(min_dis_cluster).id).E = S(C(min_dis_cluster).id).E- ( (ERX + EDA)*l ); 
            packets_TO_CH=packets_TO_CH+1;
       else 
            min_dis;
            if (min_dis>=do)
                S(i).E=S(i).E- ( ETX*(l) + Emp*l*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<do)
                S(i).E=S(i).E- ( ETX*(l) + Efs*l*( min_dis * min_dis)); 
            end
            packets_TO_BS=packets_TO_BS+1;
            packets_TO_BS_per_round=packets_TO_BS_per_round+1;
            PACKETS_TO_BS(r+1)=packets_TO_BS;
       end
        S(i).min_dis=min_dis;
       S(i).min_dis_cluster=min_dis_cluster;
   else
            min_dis=sqrt( (S(i).xd-S(n+1).xd)^2 + (S(i).yd-S(n+1).yd)^2 );
            if (min_dis>=do)
                S(i).E=S(i).E- ( Eelec*(l) + Emp*l*( min_dis * min_dis * min_dis * min_dis)); 
            end
            if (min_dis<do)
                S(i).E=S(i).E- ( Eelec*(l) + Efs*l*( min_dis * min_dis)); 
            end
            packets_TO_BS=packets_TO_BS+1;
            packets_TO_BS_per_round=packets_TO_BS_per_round+1;
   end
  end
end
STATISTICS.PACKETS_TO_CH(h,r+1)=packets_TO_CH;
STATISTICS.PACKETS_TO_BS(h,r+1)=packets_TO_BS;
STATISTICS.PACKETS_TO_BS_PER_ROUND(h,r+1)=packets_TO_BS_per_round;
STATISTICS.THROUGHPUT(h,r+1)=STATISTICS.PACKETS_TO_BS(h,r+1)+STATISTICS.PACKETS_TO_CH(h,r+1);
 En=0;
for i=1:n
    if S(i).E<=0
        continue;
    end
    En=En+S(i).E;
end
ENERGY(r+1)=En;
STATISTICS.ENERGY(h,r+1)=En;
end
first_dead_LEACH(h)=first_dead
half_dead_LEACH(h)=half_dead
all_dead_LEACH(h)=all_dead
for r=0:rmax
    STATISTICS.DEAD(h+1,r+1)=sum(STATISTICS.DEAD(:,r+1))/h;
    STATISTICS.ALLIVE(h+1,r+1)=sum(STATISTICS.ALLIVE(:,r+1))/h;
    STATISTICS.PACKETS_TO_CH(h+1,r+1)=sum(STATISTICS.PACKETS_TO_CH(:,r+1))/h;
    STATISTICS.PACKETS_TO_BS(h+1,r+1)=sum(STATISTICS.PACKETS_TO_BS(:,r+1))/h;
    STATISTICS.PACKETS_TO_BS_PER_ROUND(h+1,r+1)=sum(STATISTICS.PACKETS_TO_BS_PER_ROUND(:,r+1))/h;
    STATISTICS.THROUGHPUT(h+1,r+1)=sum(STATISTICS.THROUGHPUT(:,r+1))/h;
    STATISTICS.COUNTCHS(h+1,r+1)=sum(STATISTICS.COUNTCHS(:,r+1))/h;
    STATISTICS.ENERGY(h+1,r+1)=sum(STATISTICS.ENERGY(:,r+1))/h;
end
first_dead=sum(first_dead_LEACH)/h;
half_dead=sum(half_dead_LEACH)/h;
all_dead=sum(all_dead_LEACH)/h;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
r=0:rmax;
figure(1)
plot(r,STATISTICS.DEAD(h+1,r+1));
title('dead nodes')
figure(2)
plot(r,STATISTICS.ALLIVE(h+1,r+1));
title('live nodes')
figure(3)
plot(r,STATISTICS.PACKETS_TO_BS(h+1,r+1));
title('pkts to BS')
figure(4)
plot(r,STATISTICS.PACKETS_TO_BS_PER_ROUND(h+1,r+1));
title('pkts to BS per round')
figure(5)
plot(r,STATISTICS.PACKETS_TO_CH(h+1,r+1));
title('pkts to CH')
figure(6)
plot(r,STATISTICS.THROUGHPUT(h+1,r+1));
title('THROUGHPUT')
figure(7)
plot(r,STATISTICS.COUNTCHS(h+1,r+1));
title('COUNTCHS')
figure(8)
plot(r,STATISTICS.ENERGY(h+1,r+1));
title('Average Residual Energy') 
Now I am getting the error in line 216, temp=min(min_dis,sqrt( (S(i).xd-C(c).xd)^2 + (S(i).yd-C(c).yd)^2 ) );
Please note that this isn't the first time I am using S(i).xd, I have used it before also.
I am stumped. Please help.    Just guide me towards the correct syntax/usage. 
I am out of touch with matlab.
0 Comments
Accepted Answer
  Stephen23
      
      
 on 19 Nov 2018
        
      Edited: Stephen23
      
      
 on 19 Nov 2018
  
      The problem is related to structure C, not structure S.
The fields xd and yd of structure C are defined inside while loops whose conditions are never true on the 250th iteration of the r loop, thus you do not define those fields. This pretty easy to check: just run the code until the error occurs, then check the values in the workspace:
>> h
h =  1
>> i
i =  1
>> r
r =  250
>> C
C =
  1x250 struct array containing the fields:
    distance
    id
>> countCHs
countCHs = 0
>> t
t = 0
>> k
k =  20
It is quite clear that the conditions, e.g.:
while (countCHs < t)
are not met, so those while loops don't run.
0 Comments
More Answers (1)
  Alan Weiss
    
      
 on 19 Nov 2018
        The problem isn't S(i).xd, it is C(c).xd that doesn't exist. Your structure C(c) has fields distance and id but not xd.
Alan Weiss
MATLAB mathematical toolbox documentation
0 Comments
See Also
Categories
				Find more on Signal Processing Toolbox in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

