Reference to non-existent field 'xd'. Kindly help .
    4 次查看(过去 30 天)
  
       显示 更早的评论
    
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 个评论
采纳的回答
  Stephen23
      
      
 2018-11-19
        
      编辑:Stephen23
      
      
 2018-11-19
  
      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 个评论
更多回答(1 个)
  Alan Weiss
    
      
 2018-11-19
        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 个评论
另请参阅
类别
				在 Help Center 和 File Exchange 中查找有关 Signal Processing Toolbox 的更多信息
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


