If I try to concatenate and plot all my vectros of different size (each one rapresents a big and small wave) the result is that in the image. What I want is that in the blue circles there is no a discontinuity.
MATLAB: How to make smooth the vertcat of more vectors
interpolation
Related Solutions
hello
this will do the trick
all the best ,
load('exampledata.mat')x = data1(:,1);y = data1(:,2);centroid_x = mean(x);centroid_y = mean(y);[theta,r] = cart2pol(x-centroid_x,y-centroid_y);% sort theta in ascending order
[theta_sorted,ind] = sort(theta);r_sorted = r(ind);% remove duplicates before interpolation
[theta_unique,IA,IC] = unique(theta_sorted);r_unique = r_sorted(IA);% sliding average (smoothing)
N = 50; % adjust smoothing factor
rr = myslidingavg(r_unique, N);[u,v] = pol2cart(theta_unique,rr);u = u + centroid_x;v = v + centroid_y;plot(x,y,'.b',u,v,'.r');grid%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function out = myslidingavg(in, N)% OUTPUT_ARRAY = MYSLIDINGAVG(INPUT_ARRAY, N)
%
% The function 'slidingavg' implements a one-dimensional filtering, applying a sliding window to a sequence. Such filtering replaces the center value in
% the window with the average value of all the points within the window. When the sliding window is exceeding the lower or upper boundaries of the input
% vector INPUT_ARRAY, the average is computed among the available points. Indicating with nx the length of the the input sequence, we note that for values
% of N larger or equal to 2*(nx - 1), each value of the output data array are identical and equal to mean(in).
%% * The input argument INPUT_ARRAY is the numerical data array to be processed.
% * The input argument N is the number of neighboring data points to average over for each point of IN.
%% * The output argument OUTPUT_ARRAY is the output data array.
if (isempty(in)) | (N<=0) % If the input array is empty or N is non-positive,
disp(sprintf('SlidingAvg: (Error) empty input data or N null.')); % an error is reported to the standard output and the
return; % execution of the routine is stopped.
end % if
if (N==1) % If the number of neighbouring points over which the sliding
out = in; % average will be performed is '1', then no average actually occur and
return; % OUTPUT_ARRAY will be the copy of INPUT_ARRAY and the execution of the routine
end % if % is stopped.
nx = length(in); % The length of the input data structure is acquired to later evaluate the 'mean' over the appropriate boundaries.
if (N>=(2*(nx-1))) % If the number of neighbouring points over which the sliding out = mean(in)*ones(size(in)); % average will be performed is large enough, then the average actually covers all the points
return; % of INPUT_ARRAY, for each index of OUTPUT_ARRAY and some CPU time can be gained by such an approach.
end % if % The execution of the routine is stopped.
out = zeros(size(in)); % In all the other situations, the initialization of the output data structure is performed.
if rem(N,2)~=1 % When N is even, then we proceed in taking the half of it:
m = N/2; % m = N / 2.
else % Otherwise (N >= 3, N odd), N-1 is even ( N-1 >= 2) and we proceed taking the half of it:
m = (N-1)/2; % m = (N-1) / 2.
end % iffor i=1:nx, % For each element (i-th) contained in the input numerical array, a check must be performed:
dist2start = i-1; % index distance from current index to start index (1)
dist2end = nx-i; % index distance from current index to end index (nx)
if dist2start<m || dist2end<m % if we are close to start / end of data, reduce the mean calculation on centered data vector reduced to available samples
dd = min(dist2start,dist2end); % min of the two distance (start or end)
else dd = m; end % if out(i) = mean(in(i-dd:i+dd)); % mean of centered data , reduced to available samples at both ends of the data vector
end % for i
end
No need for a loop at all.
noise = 1.5*(n>1) + -.5*(n<0)
However, in your example, n is always between 0 and 1.
Demo
rng('default')n = rand(1,8)*3-1n = 1×8 1.4442 1.7174 -0.6190 1.7401 0.8971 -0.7074 -0.1645 0.6406
●noise = 1.5*(n>1) + -.5*(n<0)noise = 1×8 1.5000 1.5000 -0.5000 1.5000 0 -0.5000 -0.5000 0
●
Best Answer