problem in running time of my project

조회 수: 1 (최근 30일)
f4r3in
f4r3in 2019년 11월 6일
댓글: f4r3in 2019년 11월 8일
hi, my project running time make me crazy.
I write a script with only 3 " for " but when I click on run button it takes 166 second to run that.
I try it in other computers and Ihave same problem so I realize that the problem is in my script.
with same inputs my friend write another script and we both get same output but his script ran in 3 seconds and my script runs in 166 seconds. (why?) (we have same laptops)
my laptop's specs :
cpu = corei7 5500U
ram = 8 GB
here is my code please tell me where is the problem that I cant get answer in few seconds.
clc
clear
tic;
Input = [ 5 12 0.02
4 20 0.1
6 50 0.01
4 76 0.02
3 100 0.04
4 155 0.04
3 197 0.05
1 350 0.08
2 400 0.12];
n=Input(:,1);
cap=Input(:,2);
FOR=Input(:,3);
COPT=zeros;
copt1=zeros;
Prob=zeros;
%copt 1
for i=0:n(1)
copt1(i+1,1) = cap(1)*i;
copt1(i+1,2) = (nchoosek(n(1),i))*(FOR(1)^(i))*((1-FOR(1))^(n(1)-i));
end
l=1;
for i=1:size(copt1,1)
COPT(l,1)=copt1(i,1);
COPT(l,2)=copt1(i,2);
l=l+1;
end
%problem is starts from here
for i=2:size(cap,1)
a=size(COPT,1);
for j=1:n(i)
for k=1:a
COPT(l,1)=cap(i)*j + COPT(k,1);
l=l+1;
end
end
end
toc;
  댓글 수: 2
Shubham Gupta
Shubham Gupta 2019년 11월 7일
편집: Shubham Gupta 2019년 11월 7일
What was the output that you were expecting? Is it an array of dimesion (504000 x 2)? Did your friend also get the same anwer? Major problem with the last loop is variable 'a' is changing inside the loop and making COPT bigger and bigger. I am not sure if that's what you intended to do ? Why I think that is because, you haven't defined "l" before the start of your third loop and you are using same "l" that you get from second loop.
f4r3in
f4r3in 2019년 11월 7일
Yes the output must be an array with 504000*2 dimensions and we both get same output. but you said it is because of "l" and that "l" must be there it fills the rows of COPT and after one row filled the next row filled by "l"

댓글을 달려면 로그인하십시오.

채택된 답변

Shubham Gupta
Shubham Gupta 2019년 11월 7일
편집: Shubham Gupta 2019년 11월 7일
I changed one simple thing, it was working more efficiently for me:
clc
clear;
tic;
Input = [ 5 12 0.02
4 20 0.1
6 50 0.01
4 76 0.02
3 100 0.04
4 155 0.04
3 197 0.05
1 350 0.08
2 400 0.12];
n=Input(:,1);
cap=Input(:,2);
FOR=Input(:,3);
COPT=zeros;
copt1=zeros;
Prob=zeros;
%copt 1
for i=0:n(1)
copt1(i+1,1) = cap(1)*i;
copt1(i+1,2) = (nchoosek(n(1),i))*(FOR(1)^(i))*((1-FOR(1))^(n(1)-i));
end
COPT =copt1(:,1); % I removed second loop and in place made COPT a column vector
l=size(COPT,1)+1;
for i=2:size(cap,1)
a=size(COPT,1);
for j=1:n(i)
for k=1:a
COPT(l,1)=cap(i)*j + COPT(k,1);
l=l+1;
end
end
end
COPT(:,2) = zeros(size(COPT,2));
COPT(1:6,2) = copt1(:,2);
toc;
I believe this is something to do with not prelocating the size of an array, MATLAB uses more memory and bigger the dimesion of the matrix more is the time taken to change the size of it. Let me know if this works for you .
  댓글 수: 3
Shubham Gupta
Shubham Gupta 2019년 11월 7일
I am glad it worked.
As I have mentioned in the answer, you can prelocate the matrix that will be subjected to change it's size with time. But that might not always be possible, so you can reduce the dimesion of the matrix or reduce number of loops that are involved. There are no hard rules that you have to follow, it's a continuous learning process.
The major problem was when you defined COPT an array with 2 columns but in the 3rd loop you were only updating 1st column, but since you already defined COPT with 2 columns it was forced to update 2nd column with zeros. This process increased the processing time a lot. Because now the matrix was being updated 2 columns at once for each loop, whose dimesions were not fixed in the first place.
Let me know if you have further doubts.
f4r3in
f4r3in 2019년 11월 8일

Thanks a lot

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by