16

我的问题与这个问题非常相似,但我无法准确管理如何将该答案应用于我的问题。

我正在循环一个带有变量的向量,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
4

6 回答 6

30

setdiff没有() 的另一种选择是

vector(1:end ~= k)
于 2013-10-25T22:29:41.600 回答
10

vector([1:k-1 k+1:end])会做。不过,根据其他操作,可能有更好的方法来处理这个问题。

为了完整起见,如果要删除一个元素,则不需要走vector = vector([1:k-1 k+1:end])路线,可以使用vector(k)=[];

于 2013-10-25T17:47:37.287 回答
7

只是为了好玩,这里有一个有趣的方式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 中并不完全明显,但它在许多情况下都可以派上用场,所以我想我会指出这一点。

于 2013-10-25T21:06:33.957 回答
2

很容易:

newVector = vector([1:k-1 k+1:end]);

即使k是第一个或最后一个元素,这也有效。

于 2013-10-25T17:47:44.653 回答
2
%create a logic vector of same size:
l=ones(size(vector))==1;
l(k)=false;
vector(l);
于 2013-10-25T17:48:46.117 回答
0

您可以这样做的另一种方法是:

newVector = oldVector(~ismember(1:end,k))

就像setdiff真的一样工作,但构建一个逻辑掩码而不是显式索引列表。

于 2019-05-13T19:08:58.510 回答