8

给定一个向量

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

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

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

我知道您可以通过以下方式访问每个第 n 个元素

A(5:5:end)

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

4

6 回答 6

13

您可以消除这样的元素:

A = 1:100;
removalList = 1:5:100;
A(removalList) = [];
于 2012-11-20T09:13:58.533 回答
4

使用口罩。假设你有

A = 1 : 100;

然后

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

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

B = A(m ~= 4);

将导致

B == [1 2 3 4 6 7 8 9 11 12 13 14 16 ...]
于 2012-11-20T09:11:27.467 回答
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!

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

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

negatedIdx = ~idx;
A(negatedIdx) = [];
于 2012-11-20T09:28:37.623 回答
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 ...]
于 2014-02-05T08:57:23.130 回答
0

解决您的问题的一种可能方法是 function setdiff()

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

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

如果您一次完成所有操作,则可以避免两个额外的变量:

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

但是,逻辑索引是一个更快的选项,经测试

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

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

于 2015-08-25T23:34:54.207 回答
0

对于最少的代码,您几乎已经准备就绪。如果要调整现有阵列,请使用:

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

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

B=A;
B(n:n:end)=[];
于 2015-09-24T09:30:54.560 回答