Разные операции разных элементов вектора - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть вектор-столбец с несколькими значениями, например, 100. Также у меня есть вектор с некоторыми индексами, но они являются числами, а не логическими значениями (я получаю их из другого расчета). Допустим, значения 13,44,77. Теперь я хочу увеличить три значения этих индексов на 10%, а все остальное уменьшить на 10%. Со временем я буду последовательно увеличивать / уменьшать значения предыдущего вектора, используя цикл, но пока давайте просто скажем, что я делаю это только один раз. Я сделал это, но с помощью цикла for следующим образом: (Мой исходный вектор - T, а вектор индексов - A)

P=[];
for k = 1:size(T,1)
if ismember(k,A)
    q=T(k).*1.1;
else
    q=T(k).*0.9;
end
P=[P;q];

end

Таким образом, я получаю новый вектор в P. Мой вопрос, есть ли другой более быстрый и эффективный способ сделать это без цикла? потому что, как я уже сказал, мне в конечном итоге нужно будет сделать это много столбцов не только один раз

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы можете создать функцию с именем ifelse, не только на этот раз, но я думаю, что ее можно использовать во многих случаях.

function result = ifelse(condition, trueResult, falseResult)
%IFELSE input condition, ifture returns trueResult, vice versa
narginchk(3,3);  % check correct number of input args, min = 3, max = 3
if condition
    result = trueResult;
else
    result = falseResult; 
end

Основываясь на ответе из @beaker выше, я сравниваю 3методы, и это показывает, что перезапись является самой быстрой, функция arrayfun на втором месте, наконец, цикл for:

T = (1:90)';
A = [3;4;7;18;22;39;46;55;81];

% first method:using ifelse
P1 = arrayfun(@(x, y, z) ifelse(x, y, z), (ismember(1:size(T), A))',  T * 1.1, T * 0.9);

% second: using for loop
P2=[];
for k = 1:size(T,1)
if ismember(k,A)
    q=T(k).*1.1;
else
    q=T(k).*0.9;
end
P2=[P2;q];

end

% third and fastest one: assining and overwriting
P3 = T * 0.9;
P3(A) = T(A) * 1.1;

Вы можете выбрать для вашего удобства.

0 голосов
/ 13 сентября 2018

Предположим, что все значения будут уменьшены на 10%, а затем перезаписывают значения по нужным индексам с исходными значениями T, увеличенными на 10%:

P = T * 0.9;
P(A) = T(A) * 1.1;

В качестве альтернативы (особенно если вы собираетесьиспользуйте одинаковые индексы для нескольких столбцов) создайте вектор значений для умножения на исходный вектор:

F = ones(size(T,1), 1) * 0.9;
F(A) = 1.1;
P = T .* F;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...