MATLAB:在索引处重置向量

时间:2012-09-23 12:26:43

标签: matlab vector

考虑以下向量:

>> 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=2signals=4exits=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的多个不同序列的情况。

1 个答案:

答案 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