在MATLAB中的向量中添加围绕其中一个值的其他值

时间:2015-02-16 15:21:49

标签: matlab

在MATLAB中给出一个0和1的向量,其中零表示事件的时间,我想在现有事件之前和之后添加额外的事件,以便捕获其他变化。

示例:我想将[0;0;1;0;0]转换为[0;1*;1;1*;0],其中1*是新添加的{{1}}。

3 个答案:

答案 0 :(得分:3)

假设A是输入列向量 -

%// Find all neighbouring indices with a window of [-1 1] 
%// around the positions/indices of the existing ones
neigh_idx = bsxfun(@plus,find(A),[-1 1])

%// Select the valid indices and set them in A to be ones as well
A(neigh_idx(neigh_idx>=1 & neigh_idx<=numel(A))) = 1

或者使用Image Processing Toolbox中的imdilate,其中ones长度为3的矢量内核 -

A = imdilate(A,[1;1;1])

答案 1 :(得分:2)

您可以使用[1 1 1]进行卷积,并将所有值设置为1大于0。这适用于列或行vactors。

x = [0;0;1;0;0];
y = double(conv(x, [1 1 1],'same')>0)

答案 2 :(得分:0)

纯粹通过逻辑索引:

>> A = [0 1 1 0 0];
>> A([A(2:end) 0] == 1 | [0 A(1:end-1)] == 1) = 1;
>> disp(A);

A =

     1     1     1     1     0

这可能是值得解释的。事实上,它是一个3元素的本地社区,这使得这很容易。基本上,取两部分输入数组:

  • 部分#1:A从第二个元素开始到最后一个元素
  • 部分#2:A从第一个元素开始到第二个元素

我们将第一部分放入一个新数组并在此数组的末尾添加0,并检查此新数组中哪些位置等于1。这基本上将数组A向左移动1.在第一部分中的哪个位置等于1,我们将A中的相应位置设置为1.第二部分的相同内容我们实际上将数组A向右移动了1.要向右移动1,我们在开头添加0,然后提取出数组的第二部分。该第二部分中的哪个位置等于1也被设置为1。

在此操作结束时,您基本上将A向左移动1并将其另存为单独的数组。此外,您将向右移动1并将其另存为另一个数组。使用这两个,您只需在原件顶部重叠即可获得最终结果。

这个方法相对于本文前言的好处是,这不需要任何类型的计算(bsxfun, conv, imdilate等),纯粹依赖于索引到数组和使用logical运算符< SUP> 1 。这也处理边界条件,可以处理行向量或列向量。

更多带边界情况的例子

>> A = [0 0 1 1 0];
>> A([A(2:end) 0] == 1 | [0 A(1:end-1)] == 1) = 1


A =

     0     1     1     1     1

>> A = [0 0 0 0 1];
>> A([A(2:end) 0] == 1 | [0 A(1:end-1)] == 1) = 1

A =

     0     0     0     1     1

>> A = [1 0 1 0 1];
>> A([A(2:end) 0] == 1 | [0 A(1:end-1)] == 1) = 1


A =

     1     1     1     1     1

1:这篇文章专门介绍Troy Haskin,他认为几乎所有问题(包括这一个)都可以通过逻辑索引来回答。