仅当数组存在时,才从数组中删除前导零和尾随零

时间:2016-10-15 03:03:45

标签: arrays matlab

我正在尝试切断输入数组的前导和/或尾随零,这些输入数组可能有也可能没有。我已经看到了诸如以下问题的答案:

MATLAB - Remove Leading and Trailing Zeros From a Vector

这个工作正常,直到我的输入数组实际上没有用零开始/结束:

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

如果这是我的输入数组,上述问题的答案将会切断我需要的值。

当不能保证它们会在那里时,是否有一种简洁的方式(即没有多长时间'如果'语句)删除前导/尾随零?

编辑以澄清:

我知道我可以使用find()函数来获取非零索引数组,然后执行以下操作:

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

但是出现问题,因为我无法保证输入数组将具有尾随/前导零,并且可能(可能会)在非零值之间具有零。所以我的输入数组可能是以下之一:

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 ]

使用上述方法,在input2input3上将修剪我想要保留的值。

2 个答案:

答案 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结尾,则需要找到最后一个非零元素。

修改

哈,发现了一个班轮:)

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)));

答案 1 :(得分:0)

使用find功能。

最后一个非零元素的索引由:

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

,截断的数组是:

trunc = input(1,index)