【问题标题】:Extract every element except every n-th element of vector提取除向量的每个第 n 个元素之外的每个元素
【发布时间】:2012-11-08 07:32:50
【问题描述】:

给定一个向量

A = [1,2,3,...,100]

我想提取所有元素,除了每第 n 个。所以,对于 n=5,我的输出应该是

B = [1,2,3,4,6,7,8,9,11,...]

我知道你可以通过

访问每个第 n 个元素
A(5:5:end)

但我需要类似逆命令的东西。 如果这不存在,我将遍历元素并跳过每个第 n 个条目,但那将是肮脏的方式。

【问题讨论】:

  • 阅读我的答案,您寻找的“反向命令”存在。逻辑索引是 Matlab 的一个重要组成部分,也是一个非常重要的特性,需要了解和使用。
  • 在大家的帮助下,我想这就是我想要的更多:A(mod(1:100,5)~=0) 谢谢!

标签: matlab indexing


【解决方案1】:

你可以像这样消除元素:

A = 1:100;
removalList = 1:5:100;
A(removalList) = [];

【讨论】:

    【解决方案2】:

    使用面具。假设你有

    A = 1 : 100;
    

    然后

    m = mod(0 : length(A) - 1, 5);
    

    将是一个与A 长度相同的向量,其中包含重复序列0 1 2 3 4。 除了 m == 4 所在的元素,您想要 A 中的所有内容,即

    B = A(m ~= 4);
    

    会导致

    B == [1 2 3 4 6 7 8 9 11 12 13 14 16 ...]
    

    【讨论】:

      【解决方案3】:

      或者你可以使用逻辑索引:

      n = 5; % remove the fifth
      idx = logical(zeroes(size(A))); % creates a blank mask
      idx(n) = 1; % makes the nth element 1
      A(idx) = []; % ta-da!
      

      关于您引用的“反转”命令,可以使用逻辑索引来实现该行为。您可以对向量取反以将每 1 转换为 0,反之亦然。

      因此,此代码将删除除第五个元素之外的任何元素:

      negatedIdx = ~idx;
      A(negatedIdx) = [];
      

      【讨论】:

        【解决方案4】:

        为什么不这样使用呢?

        说 A 是你的向量

        A = 1:100
        n = 5
        B = A([1:n-1,n+1:end])
        

        然后

        B=[1 2 3 4 6 7 8 9 10 ...]
        

        【讨论】:

          【解决方案5】:

          您的问题的一个可能解决方案是函数setdiff()

          在您的具体情况下,解决方案是:

          lenA = length(A);
          index = setdiff(1:lenA,n:n:lenA);
          B = A(index)
          

          如果你一次性完成,你可以避免这两个额外的变量:

          B = A( setdiff(1:end,n:n:end) )
          

          但是,Logical Indexing 是一个更快的选择,如tested

          lenA = length(A);
          index = true(1, lenA);
          index(n:n:lenA) = false;
          B = A(index)
          

          所有这些代码都假设你已经指定了变量n,并且可以适应不同的值。

          【讨论】:

            【解决方案6】:

            对于最短的代码量,您几乎已经准备就绪。如果您想调整现有数组,请使用:

            A(n:n:end)=[];
            

            或者如果你想要一个名为 B 的新数组:

            B=A;
            B(n:n:end)=[];
            

            【讨论】:

              猜你喜欢
              • 2011-07-11
              • 1970-01-01
              • 1970-01-01
              • 2022-07-20
              • 1970-01-01
              • 2012-09-06
              • 1970-01-01
              • 2021-10-05
              相关资源
              最近更新 更多