【问题标题】:Adding additional ones that surround other values of one in a vector in MATLAB在 MATLAB 中的向量中添加围绕其他值的其他值
【发布时间】:2015-02-16 15:21:49
【问题描述】:

在 MATLAB 中给定一个由 0 和 1 组成的向量,其中的 0 代表时间上的事件,我想在现有的之前和之后添加额外的向量,以捕捉额外的变化。

示例:我想将[0;0;1;0;0] 变成[0;1*;1;1*;0],其中1* 是新添加的。

【问题讨论】:

  • 这里介绍的任何解决方案对您有用吗?另外,请考虑接受解决方案,因为您最近发布的问题还没有这样做。谢谢!
  • 请考虑接受我们的答案之一:meta.stackexchange.com/questions/5234/…

标签: matlab


【解决方案1】:

假设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 Toolboximdilate 与长度为ones 的向量内核3 -

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 哦,C**p。你刚刚打败了我……我会删除你在我面前发布的答案……+1
    • @kkuilla 很抱歉。您还需要额外的阈值步骤
    • @kkuilla - 是的,对于这些人,您必须真正跳出框框思考或击败他们,因为他们的速度非常快。他们偷走了所有好的答案哈哈。
    【解决方案3】:

    纯粹通过逻辑索引:

    >> 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 运算符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,他相信几乎所有问题(包括这个问题)都可以通过逻辑索引来回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2021-09-27
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多