Выберите все элементы, кроме одного в векторе
Мой вопрос очень похож на этот, но я не могу точно определить, как применить этот ответ к моей проблеме.
Я перебираю вектор с переменной 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
Ответы
Ответ 1
vector([1:k-1 k+1:end])
. В зависимости от других операций может быть лучший способ справиться с этим, однако.
Для полноты, если вы хотите удалить один элемент, вам не нужно идти по маршруту vector = vector([1:k-1 k+1:end])
, вы можете использовать vector(k)=[];
Ответ 2
Другая альтернатива без setdiff
() -
vector(1:end ~= k)
Ответ 3
Просто ради интереса, вот интересный способ с 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, но это может пригодиться во многих ситуациях, поэтому я подумал, что я бы указал на это.
Ответ 4
Очень просто:
newVector = vector([1:k-1 k+1:end]);
Это работает, даже если k
- это первый или последний элемент.
Ответ 5
%create a logic vector of same size:
l=ones(size(vector))==1;
l(k)=false;
vector(l);
Ответ 6
Вы можете сделать это еще одним способом, который позволяет исключить сразу несколько индексов (или один индекс... в основном это допустимо):
newVector = oldVector(~ismember(1:end,k))
Работает так же, как и setdiff
, но создает список логических масок вместо списка явных индексов.