私の質問は 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
vector([1:k-1 k+1:end])
が行います。ただし、他の操作によっては、これを処理するより良い方法があります。
完全を期すために、1つの要素を削除する場合は、vector = vector([1:k-1 k+1:end])
ルートに行く必要はありません。vector(k)=[];
を使用できます。
setdiff
()を使用しない別の選択肢は
vector(1:end ~= 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
と同じように機能しますが、明示的なインデックスのリストの代わりに論理マスクを作成します。