1

次のベクトルを検討してください。

>> signals

signals =

 1
 1
 1
 1
 0
 0
 0
 0
 1
 1
 1
 1
 0
 0
 0
 0

>>exits

exits =

 2
10

私がする必要があるのはsignal、信号の値が変化するまで、exit の各値からマトリックスの 1 を 0 に設定することです。たとえば、ここで、インデックス 2、3、および 4exits=2のベクトルで 1 を 0 に設定します。signal

signalこれまでに行ったことは、ベクター内で値が変化する場所を特定して、開始インデックスと停止インデックスを特定できるようにすることです。例えば:

>> find(diff(signals)~=0)

ans =

 4
 8
12

exits=2これを行うことで、 tosignals=4exits=10toの 1 を 0 に設定する必要があることがわかり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値と の複数の異なるシーケンスがある場合に一般化しようとしていますsignals

4

1 に答える 1

2

ループは、よりシンプルで読みやすいソリューションになることは間違いありません。これをループなしで行う方法は、 -array を再構築し、signalsstarts を維持して冗長を捨てることです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
于 2012-09-23T12:49:10.197 に答える