2016-10-15 12 views
1

入力配列の先頭と末尾のゼロを切り捨てようとしています。私のような質問を見てきました:配列の先頭と末尾の0を、存在する場合にのみ切り捨てます。

MATLAB - Remove Leading and Trailing Zeros From a Vector

そして、私の入力配列が実際に起動しなくなるまで、これはゼロで/終了を正常に動作します:

input = [ 1 2 0 3 4 0 0 0 0 ] 

これは私の入力配列だった場合、上記の質問に対する答えは、私が必要とする価値を切り捨てるでしょう。

先行/後続のゼロを削除するための簡潔な方法(つまり、 'if'文はありません)が存在するかどうかは保証されていませんか?明確化のため

編集:

は私がゼロ以外のインデックスの配列を取得するにはfind()機能を使用して、ような何かを行うことができることを知っている:私は持っているので、

indexes = find(input) 
trimmed_input = input(indexes(1):indexes(end)) 

しかし、問題は、発生します入力配列に後続/先行ゼロがあることを保証するものではなく、ゼロ以外の値の間にゼロがある(おそらく)こともあります。私は維持したい値をトリミングしますinput2input3のいずれかで、

input1 = [ 0 0 0 nonzero 0 nonzero 0 0 0 ] => [ nonzero 0 nonzero ] 
input2 = [ nonzero 0 nonzero 0 0 0 ] => [ nonzero 0 nonzero ] 
input3 = [ 0 0 0 nonzero 0 nonzero ] => [ nonzero 0 nonzero ] 

input4 = [ 0 0 0 nonzero nonzero 0 0 0 ] => [ nonzero nonzero ] 
input5 = [ 0 0 0 nonzero nonzero ] => [ nonzero nonzero ] 
input6 = [ nonzero nonzero 0 0 0 ] => [ nonzero nonzero ] 

そして、上記の方法を使用して:だから、私の入力配列は、のいずれかになります。

+0

いいえ、あなたのアプローチは動作します。やってみました?失敗した場合の例を示します。 – erfan

+0

ええ、あなたが正しいと思う...私はこれがうまくいかないと思った理由があることを知っています。編集:何が起こったのか知っています、私はスライスしていると思っていましたが、配列が0だったインデックスを含めていません –

答えて

1

、しかし、私は、これは動作するはずだと思う:

if input(1)==0 
    start = min(find(input~=0)) 
else 
    start = 1; 
end 
if input(end)==0 
    endnew = max(find(input~=0)) 
else 
    endnew = length(input); 
end 
trimmed_input = input(start:endnew); 
  • 0で始まる場合は、最初の非ゼロ要素を見つける必要があります。
  • 0で終わる場合、最後の非ゼロ要素を見つける必要があります。

EDIT

ハ、1つのライナーを:)見つけ

trimmed_input = input(find(input~=0,1,'first'):find(input~=0,1,'last')); 

これは実際に高速であるか、それほど複雑である場合のないアイデア。


別の方法として(何を意味するのか理解@jrbedard):

trimmed_input = input(min(find(input~=0)):max(find(input~=0))); 
+0

それは多かれ少なかれ私が今持っていることですが、関数をあまり遅くしないと思っています。それは比較的シンプルなことを行うコードのほんの一部であり、あまり読みにくいものではありません。 –

+0

ええ、私はそれであまりにも満足していないと悲しいことに、MATLABは三項演算子ではありません。私はあなたがそれらを機能させ、ちょうど不快なコードを隠すことができると思います。 – mpaskov

+0

ワンライナーに更新され、私は自分自身にとても満足しています。 – mpaskov

0

find機能を使用してください。

最後の非ゼロ要素のインデックスは次式で与えられます。

index = max(find(input~=0)) 

と切り捨て配列です:私は、現時点ではそれをワンライナーを行うにはきちんとした方法を考えることができ

trunc = input(1,index) 
+0

最後の非ゼロ要素しか見つからないので、これはうまくいかないと思います。 – mpaskov

+0

最後のN個の非ゼロ要素を見つけるために 'find'を使うとき、' 'last''フラグを使うことができます。あなたの場合、Nは1です。だから、 'index = find(input〜= 0、1、 'last');'。 BTW mpaskovは彼の声明で正しいです。 – rayryeng

関連する問題