How do I shorten my code to prevent writing the same thing over and over?
조회 수: 1 (최근 30일)
이전 댓글 표시
code I am using is as follows:
for i=1:length(Rpeaks) %starts at first peak which is first whole step
%if i==1
if Rpeaks(i)-halfsegment<0
window=(1:Rpeaks(i)+halfsegment); %takes into account that the forces don't start a full halfsegment prior to first valley
step=GRFright(window); %assign the step the actual data values
normstep=(step./max(step)); %normalize the step
toeoff=find(normstep < min(normstep)+.05 , 1);
RTO(n)=toeoff+window(1);
heelstrike=find(normstep(toeoff:end) > min(normstep)+.05 , 1);% 1st zero location; syntax of ,1 returns first satisfying value
RHS(n)=heelstrike+toeoff+window(1);
elseif Rpeaks(i)+halfsegment>length(GRFright)
window=(Rpeaks(i)-halfsegment:size(GRFright));
step=GRFright(window); %assign the step the actual data values
normstep=(step./max(step)); %normalize the step
toeoff=find(normstep < min(normstep)+.05 , 1);
RTO(n)=toeoff+window(1);
heelstrike=find(normstep(toeoff:end) > min(normstep)+.05 , 1);% 1st zero location; syntax of ,1 returns first satisfying value
RHS(n)=heelstrike+toeoff+window(1);
else
window=(Rpeaks(i)-halfsegment:Rpeaks(i)+halfsegment); %find window of frames-100 added to catch full end of step
step=GRFright(window); %assign the step the actual data values
normstep=(step./max(step)); %normalize the step
toeoff=find(normstep < min(normstep)+.05 , 1);
RTO(n)=toeoff+window(1);
heelstrike=find(normstep(toeoff:end) > min(normstep)+.05 , 1);% 1st zero location; syntax of ,1 returns first satisfying value
RHS(n)=heelstrike+toeoff+window(1);
n=n+1;
end
end
within the for loop I have the same lines written three times after the "If statement" defining what the window should be. Is there a way to shorten the code so I only have to make one change for each condition when necessary? Thanks in advance.
댓글 수: 0
채택된 답변
dpb
2016년 1월 14일
편집: dpb
2016년 1월 14일
if Rpeaks(i)-halfsegment<0
window=(1:Rpeaks(i)+halfsegment); %takes into account that the forces don't start a full halfsegment prior to first valley
elseif Rpeaks(i)+halfsegment>length(GRFright)
window=(Rpeaks(i)-halfsegment:size(GRFright));
else
window=(Rpeaks(i)-halfsegment:Rpeaks(i)+halfsegment); %find window of frames-100 added to catch full end of step
end
step=GRFright(window); %assign the step the actual data values
normstep=(step./max(step)); %normalize the step
toeoff=find(normstep < min(normstep)+.05 , 1);
RTO(n)=toeoff+window(1);
heelstrike=find(normstep(toeoff:end) > min(normstep)+.05 , 1);% 1st zero location; syntax of ,1 returns first satisfying value
RHS(n)=heelstrike+toeoff+window(1);
n=n+1
The above presumes that the increment on n is missing inside the first two conditions; if not, you're overwriting the arrays until the else case is selected so might as well throw them away, anyway.
Might be more legible if used select case end construct rather than the if elseif else end but that's also somewhat in the eye of the beholder.
댓글 수: 2
dpb
2016년 1월 14일
Sometimes it takes a fresh eye. The key here is, of course, that what you do once you set the window is identical; it gets harder where there's some that is, but some that isn't. Then factoring can become quite a trick.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Operators and Elementary Operations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!