How I can create a vector with specified blanks?

조회 수: 4 (최근 30일)
Rita
Rita 2016년 7월 5일
답변: Javad Beyranvand 2022년 5월 2일
Hi,I have a time series of daily data for 4 years(4*365 data) and I would like to have a some of daily data to be blanks(gaps) to do some analysis on the rest. My problem is that how I can create a specified length gaps,for example 3 days,on my vector data.Is there any script to create artificial gaps with specific gap length?

채택된 답변

Image Analyst
Image Analyst 2016년 7월 6일
편집: Image Analyst 2016년 7월 7일
Rita: Seems like you're having trouble so I put together this code for you:
% First we need to create sample data.
data = randi(9, 1, 300) % Create sample data.
% Get location of nans to put into the original sample data.
originalNanLocations = sort(randperm(length(data)-3, 10)) % Make 10 originall nans
data(originalNanLocations) = nan;
% Now we have our original data and we can begin...
% Find out where the original nans are, so we don't place other nans next to them
originalNanLocations = isnan(data);
% Find out how many nans we need to be in there.
% It should be about 10% of the number of elements.
numRequiredNans = floor(0.1 * length(data))
% Assign nans. Note, there may be overlap so that some stretches may be more than 3 long.
numNansCurrently = 0;
% Create a failsafe so we don't get into an infinite loop
maxIterations = 1000000;
iterationNumber = 1;
% Now loop, placing nans, until we get the required number of nans in the data.
while numNansCurrently < numRequiredNans && iterationNumber <= maxIterations
% Get location of starts of 15 "new" nan runs
nanStartLocation = randi(length(data)-4) + 1;
% Find the ending indexes of each run
nanEndLocation = nanStartLocation + 2;
% Get data from the start to the end plus one on either side of it.
% so we don't place other nans next to them,
% since that would create a stretch of 4 or more.
thisData = data((nanStartLocation-1):(nanEndLocation+1));
% Now find if out where the original nans are,
if any(isnan(thisData))
% Nans were found - skip this stretch of data.
continue;
end
% If we get here no nans were found in that location
% and we are free to assign new nans there.
data(nanStartLocation:nanEndLocation) = nan;
% Count the number of nans we have
numNansCurrently = sum(isnan(data));
iterationNumber = iterationNumber + 1;
end
data % Print to command window.
% Now the original nans will still be there and not be adjacent
% to any of the "new" nan stretches of three nans in a row.
% And the overall number of nans will be 10% of the elements
% or not more than 2 more than that.
  댓글 수: 1
Rita
Rita 2016년 7월 6일
Thank you so much Image Analyst I really appreciate your help.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Azzi Abdelmalek
Azzi Abdelmalek 2016년 7월 5일
You can set your data to nan
Data=rand(4*365,1) % your data
idx_gap=10:12
Data(idx_gap)=nan
  댓글 수: 3
Azzi Abdelmalek
Azzi Abdelmalek 2016년 7월 5일
Data=randi(10,20,1) % your data
freq=3
period=6
ii=1:period:numel(Data)
idx=bsxfun(@plus,ii',1:3)
Data(idx)=nan
Rita
Rita 2016년 7월 5일
Thanks Azzi . How can I change period to percent of data it means that for example 10 % of data ?can I just divide my data to percent (10% of 4*365)? and one more question. If I also have the original Nans in my data and don't want to overlap with the "new nans" what should I do?Thanks a lot.

댓글을 달려면 로그인하십시오.


Image Analyst
Image Analyst 2016년 7월 5일
Try this:
data = randi(9, 1, 300) % Create sample data.
% Get location of starts of 15 nan runs
nanStartLocations = sort(randperm(length(data)-3, 15))
% Find the ending indexes of each run
nanEndLocations = nanStartLocations + 3
% Assign nans. Note, there may be overlap so that some stretches may be more than 3 long.
for k = 1 : length(nanStartLocations)
data(nanStartLocations(k):nanEndLocations(k)) = nan;
end
data % Print to command window.
  댓글 수: 2
Rita
Rita 2016년 7월 5일
Thanks Image Analyst.It creates 4 nans instead of 3 nans .should I replace "3" with "2" ? and as I mentioned to Azzi If I have original Nans in my vector how I can change the script in the way that "original nans" not overlay with the "new nans".Thanks a lot.
Image Analyst
Image Analyst 2016년 7월 5일
If you want to make sure that no runs of 3 nans overlay with any other run of 3 nans, then you're going to have to check for that while you're assigning them. Change the for to a while and then check the elements to see if any are already nan. If any are, then use "continue" to skip to the bottom of the while loop. If none are, then do the assignment and increment your count. Keep going until you've added the required number of nan runs. It's not hard. Give that a try. You might try isnan() to get a list of what elements are nan.

댓글을 달려면 로그인하십시오.


Javad Beyranvand
Javad Beyranvand 2022년 5월 2일
Data=rand(4*365,1) % داده های شما idx_gap=10:12 داده(idx_gap)=nan
if true
% code
end

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by