Info

이 질문은 마감되었습니다. 편집하거나 답변을 올리려면 질문을 다시 여십시오.

How to accelerate my code

조회 수: 3 (최근 30일)
Rongyu Chu
Rongyu Chu 2019년 10월 14일
마감: MATLAB Answer Bot 2021년 8월 20일
Hi, guys. The question I am asked to solve is like this. I will be given a list of numbers (note that the first and last numbers of this list will be equal and will be the maximum number in this list). In first step, I am asked to delete all the numbers whose value is between or equal to its adjcent numbers. For example, if the list given is [2 -1 -3 -3 2]. First -1 will be delte since its value is between 2 and -3. Then -3 will be delerte since there is another -3 on the side of it. The final list will be [2 -3 2]. Similaly, the second step asks to delte 2 numbers out of 4 if both the 2nd and 3rd numbers' value is in the middle or equal to 1st and 4th number. For example, if the list is [2 -1 -2-3]. -1 and -2 will be delete. And finally, I am asked to output the index of the numebs I delete in the second step.(Note that, the index number number should come from the very first list, not list after edit). I paste my code below. It works but will take 140s. The while loops took a lof of time to run. I am wondering if there is anyway to accelerate my code like avoiding using while loop. Thank you for your guys help. Really apperciate it.
clear all; close all; clc;
N = load('expp.dat');
N = N';
len = length(N);
B= 1:len;
judge = 1;
while judge == 1
judge = 0;
for i = 1 : len-2
if (N(i+1)-N(i+2)) * (N(i+1)-N(i)) <= 0
N=[N(1:i),N(i+2:len)];
B=[B(1:i),B(i+2:len)];
judge = 1;
break
end % if
end % for
len = length(N);
end % while
A = N;
len = length(A);
%%
m = 1;
judge = 1;
file = fopen('ans.dat','w');
while judge == 1 && len >= 4
for i = 1:(len-3)
judge = 0;
if (A(i+1)-A(i))*(A(i+1)-A(i+3)) <= 0 && (A(i+2)-A(i))*(A(i+2)-A(i+3)) <=0
if A(i+1)<=A(i+2)
C(m) = B(i + 1);
C(m + 1) = B(i + 2);
else
C(m) = B(i + 2);
C(m + 1) = B(i + 1);
end % if
fprintf(file,'%8d %8d\t\n', C(m),C(m+1));
A = [A(1:i),A(i+3:len)];
B = [B(1:i),B(i+3:len)];
m = m + 2;
judge=1;
break
end % if
end % for
len = length(A);
end % while
  댓글 수: 2
darova
darova 2019년 10월 14일
Attach the data
Rongyu Chu
Rongyu Chu 2019년 10월 14일
Here is the data

답변 (2개)

Rongyu Chu
Rongyu Chu 2019년 10월 14일
Is there anyway I can use matrix instead of loops ? Matrix should be able to solve this much faster.

darova
darova 2019년 10월 14일
What about findpeaks()?
X = load('datat.txt');
X1 = X(1:100);
[~,ix1] = findpeaks(X1);
[~,ix2] = findpeaks(-X1);
plot(X1,'.-b')
hold on
plot([ix1; ix2],X1([ix1; ix2]),'or')
hold off

이 질문은 마감되었습니다.

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by