给定一个向量
A = [1,2,3,...,100]
我想提取所有元素,除了每个 n 次。所以,对于 n=5,我的输出应该是
B = [1,2,3,4,6,7,8,9,11,...]
我知道您可以通过以下方式访问每个第 n 个元素
A(5:5:end)
但我需要类似逆命令的东西。如果这不存在,我将遍历元素并跳过每个第 n 个条目,但这将是肮脏的方式。
您可以消除这样的元素:
A = 1:100;
removalList = 1:5:100;
A(removalList) = [];
使用口罩。假设你有
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 ...]
或者您可以使用逻辑索引:
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) = [];
为什么不这样使用呢?
说 A 是你的向量
A = 1:100
n = 5
B = A([1:n-1,n+1:end])
然后
B=[1 2 3 4 6 7 8 9 10 ...]
解决您的问题的一种可能方法是 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
,并且可以适应不同的值。
对于最少的代码,您几乎已经准备就绪。如果要调整现有阵列,请使用:
A(n:n:end)=[];
或者,如果您想要一个名为 B 的新数组:
B=A;
B(n:n:end)=[];