How can I increase the size of an array that is already in the workspace with increments of 0.1?
    4 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
    Filipe Silva
 il 8 Lug 2021
  
    
    
    
    
    Commentato: Mathieu NOE
      
 il 12 Lug 2021
            I am doing my dissertation for my masters and I ran into a problem, I am trying to compute the error between a smooth spline and the original line, however the arrays do not match in size, I am tryingg to increase the original array which has a size of 45x2, how can I create a new array from this smaller array with increment increase of 0.1
Thank you 
12 Commenti
  Mathieu NOE
      
 il 9 Lug 2021
				yet another issue - now I lack one toolbox to continue 
'distance' requires one of the following:
  Antenna Toolbox
  Automated Driving Toolbox
  Communications Toolbox
  Computer Vision Toolbox
  Mapping Toolbox
  Navigation Toolbox
  Phased Array System Toolbox
  Sensor Fusion and Tracking Toolbox
Error in Filipe>explore_successors (line 225)
                        successors(successor_count,3) = h+distance(x_cell,y_cell,s_x,s_y);%h
Error in Filipe (line 114)
    successors=explore_successors(cell_x,cell_y,path_cost,x_target,y_target,in_valid,max_x,max_y);
  Mathieu NOE
      
 il 9 Lug 2021
				easily solved by creating my own function - that wasn't too much complicated ....
%%%%%%%%%%%%%%%%%
function d = mydistance(x1,y1,x2,y2)
d = sqrt((x1-x2).^2 + (y1-y2).^2);
end
Risposta accettata
  Mathieu NOE
      
 il 9 Lug 2021
        so this is the status now : 
1/ I believe I fixed a couple of issues at the end of the main code : 
now both linear and spline curves have same dimensions and error can be computed : 
% m=path(:,1);
% m1=x_start;
% m2=m1:0.1:m;
x1=[path(:,1);x_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
y1=[path(:,2);y_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
xq=(min(x1):0.1:max(x1))';  % correction here also
vq =interp1(x1,y1,xq,'spline'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
y2 =interp1(x1,y1,xq,'linear'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
plot(xq,y2,xq,vq,'b','LineWidth',2);
error_rms = sqrt(mean((y2-vq).^2))
error_rms =     0.0227
PLOT : 

Full code : 
clc
clearvars
max_x=50;
max_y=30;
environment=2*(ones(max_x,max_y));
j=0;
x_val = 1;
y_val = 1;
axis([1 max_x+1 1 max_y+1])
grid on;
grid minor
hold on;
n=0;
xval=48;
yval=28;
x_target=xval;
y_target=yval;
environment(xval,yval)=0;%Initialize environment with location of the target
plot(xval,yval,'gd');
text(xval+1,yval+.5,'Target')
% obstacle 1
for i = 9:14
    for j = 24:27
        environment(i,j) = -1; 
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [9.5, 14.5, 14.5, 9.5];
y = [24.5, 24.5, 27.5, 27.5];
fill(x,y,'k');
% obstacle 2
for i = 17:23
    for j = 21:25 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [17.5, 23.5, 23.5, 17.5];
y = [21.5, 21.5, 25.5, 25.5];
fill(x,y,'k');
% obstacle 3
for i = 27:33
    for j = 20:27 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [27.5, 33.5, 33.5, 27.5];
y = [20.5, 20.5, 27.5, 27.5];
fill(x,y,'k');
% obstacle 4
for i = 28:33
    for j = 11:18 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [28.5, 33.5, 33.5, 28.5];
y = [11.5, 11.5, 18.5, 18.5];
fill(x,y,'k');
% obstacle 5
for i = 37:41
    for j = 11:27 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [37.5, 41.5, 41.5, 37.5];
y = [11.5, 11.5, 27.5, 27.5];
fill(x,y,'k');
%plot(19+.5,19+.5,'gd');
xval=3;
yval=20;
x_start=xval;%Starting Position
y_start=yval;%Starting Position
environment(xval,yval)=1;
 plot(xval,yval,'bo');
valid=[]; % x | y | parent_x | parent_y | h(n) | g(n) | f(n) 
in_valid=[]; % x | y
k=1;
for i=1:max_x
    for j=1:max_y
        if(environment(i,j) == -1) % check if obstacle
            in_valid(k,1)=i; 
            in_valid(k,2)=j; 
            k=k+1;
        end
    end
end
in_valid_size=size(in_valid,1);
cell_x=x_start;
cell_y=y_start;
valid_size=1; % initialize size of valid_list
path_cost=0;
goal_distance=sqrt((cell_x-x_target)^2 + (cell_y-y_target)^2);
new_row=[1,8];
new_row(1,1)=1;
new_row(1,2)=cell_x;
new_row(1,3)=cell_y;
new_row(1,4)=cell_x; % parent x
new_row(1,5)=cell_y; % parent y 
new_row(1,6)=path_cost;
new_row(1,7)=goal_distance;
new_row(1,8)=goal_distance;
valid(valid_size,:)=new_row; % initializing path with start position
valid(valid_size,1)=0;
in_valid_size=in_valid_size+1;
in_valid(in_valid_size,1)=cell_x; % make it invalid for further iterations
in_valid(in_valid_size,2)=cell_y;
path_not_found=1;
while((cell_x ~= x_target || cell_y ~= y_target) && path_not_found == 1)
    % x | y | h | g | f
    successors=explore_successors(cell_x,cell_y,path_cost,x_target,y_target,in_valid,max_x,max_y);
    successors_size=size(successors,1);
    for i=1:successors_size
    flag=0;
    for j=1:valid_size
        if(successors(i,1) == valid(j,2) && successors(i,2) == valid(j,3) ) % if successor same as already existing cell inpath
%             disp('valid')
%             valid
%             disp(' ');
            valid(j,8)=min(valid(j,8),successors(i,5)); % check for minimum f and then pick it 
            if valid(j,8) == successors(i,5)
                valid(j,4)=cell_x;% parent x
                valid(j,5)=cell_y;% parent y
                valid(j,6)=successors(i,3); % h
                valid(j,7)=successors(i,4); % g
            end;
            flag=1;
        end;
    end;
    if flag == 0 % if new cell with minimum f(n) then add to valid_path
        valid_size= valid_size+1;
        new_row=[1,8];
        new_row(1,1)=1;
        new_row(1,2)=successors(i,1);
        new_row(1,3)=successors(i,2);
        new_row(1,4)=cell_x; % parent x
        new_row(1,5)=cell_y; % parent y
        new_row(1,6)=successors(i,3); % h
        new_row(1,7)=successors(i,4); % g
        new_row(1,8)=successors(i,5); % f
        valid(valid_size,:)= new_row;
     end;
    end;
    index_min_cell = min_f(valid,valid_size,x_target,y_target);
    if (index_min_cell ~= -1) % if index with minimum fn is obstacle no path exists    
        cell_x=valid(index_min_cell,2);
        cell_y=valid(index_min_cell,3);
        path_cost=valid(index_min_cell,6);
        in_valid_size=in_valid_size+1; % put the cell in_valid so we dont come back on it again
        in_valid(in_valid_size,1)=cell_x;
        in_valid(in_valid_size,2)=cell_y;
        valid(index_min_cell,1)=0;
    else
        path_not_found=0;
    end;
end;
% backtracking to find the path
i=size(in_valid,1);
path=[];
xval=in_valid(i,1); % pick last in in_valid_list that must be target
yval=in_valid(i,2);
i=1;
path(i,1)=xval;
path(i,2)=yval;
i=i+1;
if ( (xval == x_target) && (yval == y_target))
    inode=0;
   parent_x=valid(find((valid(:,2) == xval) & (valid(:,3) == yval),1),4);
   parent_y=valid(find((valid(:,2) == xval) & (valid(:,3) == yval),1),5);
   while( parent_x ~= x_start || parent_y ~= y_start)
           path(i,1) = parent_x;
           path(i,2) = parent_y;
           inode=find((valid(:,2) == parent_x) & (valid(:,3) == parent_y),1);
           parent_x=valid(inode,4);
           parent_y=valid(inode,5);
           i=i+1;
    end;
% plottin path
j=size(path,1);
 p=plot(path(j,1),path(j,2),'bo');
  j=j-1;
 for i=j:-1:1
  pause(.25);
  set(p,'XData',path(i,1),'YData',path(i,2));
 drawnow ;
 end;
 plot(path(:,1),path(:,2));
else
disp( 'Sorry, No path exists to the Target!');
end
% m=path(:,1);
% m1=x_start;
% m2=m1:0.1:m;
x1=[path(:,1);x_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
y1=[path(:,2);y_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
xq=(min(x1):0.1:max(x1))';  % correction here also
vq =interp1(x1,y1,xq,'spline'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
y2 =interp1(x1,y1,xq,'linear'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
plot(xq,y2,xq,vq,'b','LineWidth',2);
error_rms = sqrt(mean((y2-vq).^2))
%%%%%%%%%%%%%%%%%
function d = mydistance(x1,y1,x2,y2)
d = sqrt((x1-x2).^2 + (y1-y2).^2);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function successors=explore_successors(x_cell,y_cell,h,x_target,y_target,in_valid,max_x,max_y)
    successors=[];
    successor_count=1;
    c2=size(in_valid,1);
    for k= 1:-1:-1
        for j= 1:-1:-1
            if (k~=j || k~=0)  %The node itself is not its successor
                s_x = x_cell+k;
                s_y = y_cell+j;
                if( (s_x >0 && s_x <=max_x) && (s_y >0 && s_y <=max_y)) % successor within the matrix
                    flag=1;                    
                    for c1=1:c2
                        if(s_x == in_valid(c1,1) && s_y == in_valid(c1,2)) % successor not an obstacle or already visited
                            flag=0;
                        end;
                    end;
                    if (flag == 1)
                        successors(successor_count,1) = s_x;
                        successors(successor_count,2) = s_y;
%                         successors(successor_count,3) = h+distance(x_cell,y_cell,s_x,s_y);%h
                        successors(successor_count,3) = h+mydistance(x_cell,y_cell,s_x,s_y);%h
%                         successors(successor_count,4) = distance(x_target,y_target,s_x,s_y);%g
                        successors(successor_count,4) = mydistance(x_target,y_target,s_x,s_y);%g
                        successors(successor_count,5) = successors(successor_count,3)+successors(successor_count,4);%f
                        successor_count=successor_count+1;
                    end
                end
            end
        end
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function index_of_min = min_f(valid,valid_len,x_target,y_target)
 temp_array=[];
 k=1;
 flag=0;
 goal_index=0;
 for j=1:valid_len
     if (valid(j,1)==1)
         temp_array(k,:)=[valid(j,:) j]; 
         if (valid(j,2)==x_target && valid(j,3)==y_target)
             flag=1;
             goal_index=j;
         end;
         k=k+1;
     end;
 end;
 if flag == 1 
     index_of_min=goal_index;
 end
 if size(temp_array ~= 0)
  [min_f,temp_min]=min(temp_array(:,8));
  %min_f
  index_of_min=temp_array(temp_min,9);
  fprintf('Cell with minimum f found to be x : %d y : %d with f = %f',valid(index_of_min,2),valid(index_of_min,3),valid(index_of_min,8));
 else
     index_of_min=-1;
 end;
end
3 Commenti
  Mathieu NOE
      
 il 12 Lug 2021
				hello 
this compute the euclidian distance between two points . Simply I had to write this function becasue in your code you are using a similar function from a toolbox I don't have. But as you can see that was easily solved.
bye
Più risposte (2)
  KSSV
      
      
 il 9 Lug 2021
        You need to use interp1. 
Let A be your original array of size 45*2. 
dx = 0.1 ; 
x = A(:,1) ; y = A(:,2) ; 
xi = min(x):dx:max(x) ; 
yi = interp1(x,y,xi) ; 
  Mathieu NOE
      
 il 9 Lug 2021
        so , maybe now I acn provide an answer.... 
had a couple of questions to myself - and tried to solve it this way : 
now we have both the linear and spline path data the same size 
y2 is basically the same linear y1 data but smapled at the new delta = 0.1 (using interp1 again but with "linear" argument;
below is the end of the main code that I changed quite a bit : 
% m=path(:,1);
% m1=x_start;
% m2=m1:0.1:m;
x1=[path(:,1);x_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
y1=[path(:,2);y_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
xq=(min(x1):0.1:max(x1))';  % correction here also
vq =interp1(x1,y1,xq,'spline'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
y2 =interp1(x1,y1,xq,'linear'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
plot(xq,y2,xq,vq,'b','LineWidth',2);
error_rms = sqrt(mean((y2-vq).^2));
%%%%%%%%%%%%%%%%%
function d = mydistance(x1,y1,x2,y2)
d = sqrt((x1-x2).^2 + (y1-y2).^2);
end
result is : error_rms =     0.0227
plot : 

entire code below : 
clc
clearvars
max_x=50;
max_y=30;
environment=2*(ones(max_x,max_y));
j=0;
x_val = 1;
y_val = 1;
axis([1 max_x+1 1 max_y+1])
grid on;
grid minor
hold on;
n=0;
xval=48;
yval=28;
x_target=xval;
y_target=yval;
environment(xval,yval)=0;%Initialize environment with location of the target
plot(xval,yval,'gd');
text(xval+1,yval+.5,'Target')
% obstacle 1
for i = 9:14
    for j = 24:27
        environment(i,j) = -1; 
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [9.5, 14.5, 14.5, 9.5];
y = [24.5, 24.5, 27.5, 27.5];
fill(x,y,'k');
% obstacle 2
for i = 17:23
    for j = 21:25 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [17.5, 23.5, 23.5, 17.5];
y = [21.5, 21.5, 25.5, 25.5];
fill(x,y,'k');
% obstacle 3
for i = 27:33
    for j = 20:27 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [27.5, 33.5, 33.5, 27.5];
y = [20.5, 20.5, 27.5, 27.5];
fill(x,y,'k');
% obstacle 4
for i = 28:33
    for j = 11:18 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [28.5, 33.5, 33.5, 28.5];
y = [11.5, 11.5, 18.5, 18.5];
fill(x,y,'k');
% obstacle 5
for i = 37:41
    for j = 11:27 
        environment(i,j) = -1;
        %plot(i+.5,j+.5,'rd'); 
    end
end
x = [37.5, 41.5, 41.5, 37.5];
y = [11.5, 11.5, 27.5, 27.5];
fill(x,y,'k');
%plot(19+.5,19+.5,'gd');
xval=3;
yval=20;
x_start=xval;%Starting Position
y_start=yval;%Starting Position
environment(xval,yval)=1;
 plot(xval,yval,'bo');
valid=[]; % x | y | parent_x | parent_y | h(n) | g(n) | f(n) 
in_valid=[]; % x | y
k=1;
for i=1:max_x
    for j=1:max_y
        if(environment(i,j) == -1) % check if obstacle
            in_valid(k,1)=i; 
            in_valid(k,2)=j; 
            k=k+1;
        end
    end
end
in_valid_size=size(in_valid,1);
cell_x=x_start;
cell_y=y_start;
valid_size=1; % initialize size of valid_list
path_cost=0;
goal_distance=sqrt((cell_x-x_target)^2 + (cell_y-y_target)^2);
new_row=[1,8];
new_row(1,1)=1;
new_row(1,2)=cell_x;
new_row(1,3)=cell_y;
new_row(1,4)=cell_x; % parent x
new_row(1,5)=cell_y; % parent y 
new_row(1,6)=path_cost;
new_row(1,7)=goal_distance;
new_row(1,8)=goal_distance;
valid(valid_size,:)=new_row; % initializing path with start position
valid(valid_size,1)=0;
in_valid_size=in_valid_size+1;
in_valid(in_valid_size,1)=cell_x; % make it invalid for further iterations
in_valid(in_valid_size,2)=cell_y;
path_not_found=1;
while((cell_x ~= x_target || cell_y ~= y_target) && path_not_found == 1)
    % x | y | h | g | f
    successors=explore_successors(cell_x,cell_y,path_cost,x_target,y_target,in_valid,max_x,max_y);
    successors_size=size(successors,1);
    for i=1:successors_size
    flag=0;
    for j=1:valid_size
        if(successors(i,1) == valid(j,2) && successors(i,2) == valid(j,3) ) % if successor same as already existing cell inpath
%             disp('valid')
%             valid
%             disp(' ');
            valid(j,8)=min(valid(j,8),successors(i,5)); % check for minimum f and then pick it 
            if valid(j,8) == successors(i,5)
                valid(j,4)=cell_x;% parent x
                valid(j,5)=cell_y;% parent y
                valid(j,6)=successors(i,3); % h
                valid(j,7)=successors(i,4); % g
            end;
            flag=1;
        end;
    end;
    if flag == 0 % if new cell with minimum f(n) then add to valid_path
        valid_size= valid_size+1;
        new_row=[1,8];
        new_row(1,1)=1;
        new_row(1,2)=successors(i,1);
        new_row(1,3)=successors(i,2);
        new_row(1,4)=cell_x; % parent x
        new_row(1,5)=cell_y; % parent y
        new_row(1,6)=successors(i,3); % h
        new_row(1,7)=successors(i,4); % g
        new_row(1,8)=successors(i,5); % f
        valid(valid_size,:)= new_row;
     end;
    end;
    index_min_cell = min_f(valid,valid_size,x_target,y_target);
    if (index_min_cell ~= -1) % if index with minimum fn is obstacle no path exists    
        cell_x=valid(index_min_cell,2);
        cell_y=valid(index_min_cell,3);
        path_cost=valid(index_min_cell,6);
        in_valid_size=in_valid_size+1; % put the cell in_valid so we dont come back on it again
        in_valid(in_valid_size,1)=cell_x;
        in_valid(in_valid_size,2)=cell_y;
        valid(index_min_cell,1)=0;
    else
        path_not_found=0;
    end;
end;
% backtracking to find the path
i=size(in_valid,1);
path=[];
xval=in_valid(i,1); % pick last in in_valid_list that must be target
yval=in_valid(i,2);
i=1;
path(i,1)=xval;
path(i,2)=yval;
i=i+1;
if ( (xval == x_target) && (yval == y_target))
    inode=0;
   parent_x=valid(find((valid(:,2) == xval) & (valid(:,3) == yval),1),4);
   parent_y=valid(find((valid(:,2) == xval) & (valid(:,3) == yval),1),5);
   while( parent_x ~= x_start || parent_y ~= y_start)
           path(i,1) = parent_x;
           path(i,2) = parent_y;
           inode=find((valid(:,2) == parent_x) & (valid(:,3) == parent_y),1);
           parent_x=valid(inode,4);
           parent_y=valid(inode,5);
           i=i+1;
    end;
% plottin path
j=size(path,1);
 p=plot(path(j,1),path(j,2),'bo');
  j=j-1;
 for i=j:-1:1
  pause(.25);
  set(p,'XData',path(i,1),'YData',path(i,2));
 drawnow ;
 end;
 plot(path(:,1),path(:,2));
else
disp( 'Sorry, No path exists to the Target!');
end
% m=path(:,1);
% m1=x_start;
% m2=m1:0.1:m;
x1=[path(:,1);x_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
y1=[path(:,2);y_start]; % seemed to me the start point is missing in "path" so added manually at the bottom
xq=(min(x1):0.1:max(x1))';  % correction here also
vq =interp1(x1,y1,xq,'spline'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
y2 =interp1(x1,y1,xq,'linear'); %see interp1() for other interpolation methods. Extrapolation is dangerous.
plot(xq,y2,xq,vq,'b','LineWidth',2);
error_rms = sqrt(mean((y2-vq).^2));
%%%%%%%%%%%%%%%%%
function d = mydistance(x1,y1,x2,y2)
d = sqrt((x1-x2).^2 + (y1-y2).^2);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function successors=explore_successors(x_cell,y_cell,h,x_target,y_target,in_valid,max_x,max_y)
    successors=[];
    successor_count=1;
    c2=size(in_valid,1);
    for k= 1:-1:-1
        for j= 1:-1:-1
            if (k~=j || k~=0)  %The node itself is not its successor
                s_x = x_cell+k;
                s_y = y_cell+j;
                if( (s_x >0 && s_x <=max_x) && (s_y >0 && s_y <=max_y)) % successor within the matrix
                    flag=1;                    
                    for c1=1:c2
                        if(s_x == in_valid(c1,1) && s_y == in_valid(c1,2)) % successor not an obstacle or already visited
                            flag=0;
                        end;
                    end;
                    if (flag == 1)
                        successors(successor_count,1) = s_x;
                        successors(successor_count,2) = s_y;
%                         successors(successor_count,3) = h+distance(x_cell,y_cell,s_x,s_y);%h
                        successors(successor_count,3) = h+mydistance(x_cell,y_cell,s_x,s_y);%h
%                         successors(successor_count,4) = distance(x_target,y_target,s_x,s_y);%g
                        successors(successor_count,4) = mydistance(x_target,y_target,s_x,s_y);%g
                        successors(successor_count,5) = successors(successor_count,3)+successors(successor_count,4);%f
                        successor_count=successor_count+1;
                    end
                end
            end
        end
    end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function index_of_min = min_f(valid,valid_len,x_target,y_target)
 temp_array=[];
 k=1;
 flag=0;
 goal_index=0;
 for j=1:valid_len
     if (valid(j,1)==1)
         temp_array(k,:)=[valid(j,:) j]; 
         if (valid(j,2)==x_target && valid(j,3)==y_target)
             flag=1;
             goal_index=j;
         end;
         k=k+1;
     end;
 end;
 if flag == 1 
     index_of_min=goal_index;
 end
 if size(temp_array ~= 0)
  [min_f,temp_min]=min(temp_array(:,8));
  %min_f
  index_of_min=temp_array(temp_min,9);
  fprintf('Cell with minimum f found to be x : %d y : %d with f = %f',valid(index_of_min,2),valid(index_of_min,3),valid(index_of_min,8));
 else
     index_of_min=-1;
 end;
end
0 Commenti
Vedere anche
Categorie
				Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!







