我的问题与这个问题非常相似,但我无法准确管理如何将该答案应用于我的问题。
我正在循环一个带有变量的向量,k
并且想要选择除 index 处的单个值之外的整个向量k
。
任何想法?
for k = 1:length(vector)
newVector = vector( exluding index k); <---- what mask should I use?
% other operations to do with the newVector
end
setdiff
没有() 的另一种选择是
vector(1:end ~= k)
vector([1:k-1 k+1:end])
会做。不过,根据其他操作,可能有更好的方法来处理这个问题。
为了完整起见,如果要删除一个元素,则不需要走vector = vector([1:k-1 k+1:end])
路线,可以使用vector(k)=[];
只是为了好玩,这里有一个有趣的方式setdiff
:
vector(setdiff(1:end,k))
你问,除了使用之外,这有什么有趣的setdiff
?看位置end
。MATLAB 的end
关键字在此上下文中转换为最后一个索引vector
,甚至作为函数调用的参数,而不是直接与paren
(vector
的()
运算符一起使用。无需使用numel(vector)
. 换一种方式,
>> vector=1:10;
>> k=6;
>> vector(setdiff(1:end,k))
ans =
1 2 3 4 5 7 8 9 10
>> setdiff(1:end,k)
Error using setdiff (line 81)
Not enough input arguments.
这在 IMO 中并不完全明显,但它在许多情况下都可以派上用场,所以我想我会指出这一点。
很容易:
newVector = vector([1:k-1 k+1:end]);
即使k
是第一个或最后一个元素,这也有效。
%create a logic vector of same size:
l=ones(size(vector))==1;
l(k)=false;
vector(l);
您可以这样做的另一种方法是:
newVector = oldVector(~ismember(1:end,k))
就像setdiff
真的一样工作,但构建一个逻辑掩码而不是显式索引列表。