web-dev-qa-db-ja.com

ベクター内の1つを除くすべての要素を選択します

私の質問は this one に非常に似ていますが、その答えを私の問題にどのように適用するかを正確に管理することはできません。

変数kを使用してベクトルをループし、インデックスkの単一の値を除くベクトル全体を選択したい。

何か案が?

for k = 1:length(vector)

   newVector = vector( exluding index k);    <---- what mask should I use? 
   % other operations to do with the newVector

end
15
Matteo

vector([1:k-1 k+1:end])が行います。ただし、他の操作によっては、これを処理するより良い方法があります。

完全を期すために、1つの要素を削除する場合は、vector = vector([1:k-1 k+1:end])ルートに行く必要はありません。vector(k)=[];を使用できます。

9
arne.b

setdiff()を使用しない別の選択肢は

vector(1:end ~= k)
27
ChaoticByNature

ただの楽しみのために、ここに 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ではありませんが、多くの状況で役立つことがあるため、これを指摘すると思いました。

6
chappjc

非常に簡単:

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

これは、kが最初または最後の要素であっても機能します。

2
Luis Mendo
%create a logic vector of same size:
l=ones(size(vector))==1;
l(k)=false;
vector(l);
2
Daniel

これを行う別の方法として、複数のインデックスを一度に除外することができます(または、単一のインデックス...基本的にどちらかを許可することは堅牢です):

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

setdiffと同じように機能しますが、明示的なインデックスのリストの代わりに論理マスクを作成します。

0
GaetaWoo