提取除向量的每个第n个元素之外的每个元素

时间:2012-11-20 09:05:00

标签: matlab indexing

给出一个向量

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

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

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

我知道您可以通过

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

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

6 个答案:

答案 0 :(得分:13)

你可以删除这样的元素:

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

答案 1 :(得分:4)

使用面具。假设你有

A = 1 : 100;

然后

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

将是与包含重复序列A的{​​{1}}相同长度的向量。 除了0 1 2 3 4,即

之外的元素,您需要A中的所有内容
m == 4

将导致

B = A(m ~= 4);

答案 2 :(得分:2)

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

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!

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

所以,这段代码将删除任何BUT第五个元素:

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

答案 3 :(得分:1)

为什么不这样使用呢?

说A是你的载体

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

然后

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

答案 4 :(得分:0)

问题的一个可能解决方案是函数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,并且可以适应不同的值。

答案 5 :(得分:0)

对于最短的代码量,你几乎已经准备好了。如果要调整现有阵列使用:

fgets

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

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