我有一个1和0的辅助功能矢量。 1表示天气好; 0表示天气不好,无法进入。
我有一个(例如)10小时的step_duration。考虑到step_index(步骤的开始)为101,我需要找到一个直接10小时良好天气的窗口。
预期解决方案:预计天气达10小时后,可访问性向量为[0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1]。因此,我们找到窗口的索引是109-118。相应的天气延迟(考虑到我们找不到直接的小时数)来自索引101-108(即9小时)。我需要为这样的算法编写代码。
我能想到的一些示例代码如下(虽然这不是我想要的):
window = 0; % Initialize the counter for finding the weather window.
for tt = step_index
if Accessibility(tt) == 0
% bad weather, move to next index
% reset window.
window = 0;
k = k + 1;
possible_window(k) = window;
continue
else
% Increase window
window = window + 1;
% sote window history
k = k + 1;
possible_window (k) = window;
end
end
tt = tt + 1;
end
答案 0 :(得分:2)
我不确定你输出的是什么输出,但你可以很容易地使用卷积找到一组10个或更多1
:
w = [0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1]
n = 10;
find(conv(w, ones(1,n)) == n) - n + 1
这将为您提供10个组的起始位置的索引
答案 1 :(得分:2)
让数据
w = [0 0 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1];
step_index = 101;
step_duration = 10;
然后:
d = diff([0 w 0]);
starts = find(d==1); %// indices of starts of runs of 1's
ends = find(d==-1); %// indices of ends of runs of 1's (actually starts of 0's)
keep = find(ends-starts>=step_duration); %// detect runs that are long enough
starts = starts(keep)+step_index-1; %// keep only those runs and adjust with "-1"
ends = ends(keep)+step_index-2; %// "-2" because of how ends is defined
结果在向量starts
和ends
中。在您的示例中,只有一个这样的窗口,因此它们只包含一个元素:
starts =
109
ends =
118
答案 2 :(得分:1)
基于strfind
的解决方案,找到N或N +连续的起始指数 -
%// sample accessibility vector (different from the one in question)
access_vec = [1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0]
N = 10; %// N or N+ consecutive ones are to be detected
indices = strfind([0 access_vec],[0 ones(1,N)])
输出 -
indices =
1 13
另一个例子 -
access_vec = [ 0 1 zeros(1,10) 1]
输出 -
indices =
[]
答案 3 :(得分:0)
我认为你正在寻找一个天气好的时期,在这段时间内,这个时期将被定义为在10天内有足够的时间。
在这种情况下,您可以使用过滤器来检查每一段10中出现的过滤器数量。可能是这样的:
f= filter(ones(10,1),1,x)
不确定语法,但请查看。过滤器肯定会让你到那里。
然后你可以通过寻找好的时期来跟进:
find(f==10)
find(f>=8)
find(f==max(f))