создать новый вектор со специальными условиями и cumsum_function из другого вектора -matlab - PullRequest
2 голосов
/ 01 марта 2020

рассмотрите вектор как 'e'. я хотел сделать ниже условия и создать новый вектор «е». условия: если e (i) <5, то его необходимо заменить на e (i) + e (i + 1), чтобы оно было больше 5, в противном случае e (i) нужно заменить на e ( я) + е (я + 1) + е (я + 2) и так далее. модифицированный вектор может иметь длину, отличную от исходного вектора. </p>

пример:

e(old)=[2,6,10,4,3,6,1,2,3]
e(new)=[8,10,7,6,6]

на самом деле я мог бы написать его с помощью этого сценария

    clc;clear all
e=[2,6,10,4,3,6,1,2,3];
e_tmp=0;
k=0;
for i=1:size(e,2)
    e_tmp=e(i)+e_tmp;
    if e_tmp>=5
        k=k+1;
        A(k)=e_tmp;
        e_tmp=0;
    else
        A(k+1)=e_tmp;
    end
end

, но я хочу напишите это с помощью cumsum_function

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Если вы хотите использовать cumsum, приведенный ниже код может быть вариантом

e =[2,6,10,4,3,6,1,2,3];
A = [];
while true
  if isempty(e)
    break;
  end  
  csum = cumsum(e); % cumsum of vector e
  ind = find(csum >=5,1,'first'); % find the index of first one that is >= 5
  A(end+1) = csum(ind); % put the value to A
  e = e(ind+1:end); % update vector from ind+1 to the end
  if sum(e) < 5 % if the sum of leftover in e is less than 5, then add them up to the end of A
    A(end) = A(end) + sum(e);
  end
end

таким, что

>> A
A =

    8   10    7    6    6
0 голосов
/ 02 марта 2020

При использовании b=cumsum(e) вместо e вы можете суммировать несколько членов, просто удалив всех, кроме последнего. Затем в конце вы возвращаетесь к исходному представлению, используя diff

e=[2,6,10,4,3,6,1,2,3]; %example data
b=cumsum(e);
while true
    ix=find(diff([0,b])<5,1); %find first index violating the rule
    if isempty(ix) %we are done
        break
    end
    b(ix)=[]; %delete element b(ix) to make e(ix)=e(ix)+e(ix+1)
end
e=diff([0,b]);
...