考虑以下向量:
>> signals
signals =
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
>>exits
exits =
2
10
我需要做的是从出口中的每个值将{1}}矩阵中的1设置为0,直到信号中的值发生变化。例如,在signal
的位置,我会在exits=2
向量中将标记2,3和4设置为0。
到目前为止,我所做的是确定signal
向量中值的变化位置,以便我可以识别开始和停止索引。例如:
signal
通过这样做,我知道我必须将{1}设置为0到>> find(diff(signals)~=0)
ans =
4
8
12
到exits=2
和signals=4
到exits=10
。然而,我陷入困境,想知道如何在没有循环的情况下做到这一点。
我意识到这可能有点模糊,所以这里有一个更简单的例子:
signals=12
我基本上试图将这个简单示例概括为多个>> signals
signals =
1
1
1
1
1
0
0
0
1
1
1
>> exit
exit =
3
>> rst=exit:find(diff(signals)~=0)
rst =
3 4 5
signals =
1
1
0
0
0
0
0
0
1
1
1
值和exit
的多个不同序列的情况。
答案 0 :(得分:2)
循环肯定是更简单,更易读的解决方案。没有循环的方法是重建signals
- 数组,保持开始并丢弃多余的exits
。
signals = [
1
1
1
1
1
0
0
0
1
1
1];
exit = 3;
startEnd = diff([0;signals]);
%# add the new exit
startEnd(exit) = -1;
%# remove redundant "exits"
startEndIdx = find(startEnd);
deltaEvent = diff([0;startEnd(startEndIdx)]);
deltaIsZero = deltaEvent == 0; %# these are the bad exits
startEnd(startEndIdx(deltaIsZero)) = 0;
%# now we can reconstruct the signals vector
signals = cumsum(startEnd)
signals =
1
1
0
0
0
0
0
0
1
1
1