NAN answers problem in matrix

1 Ansicht (letzte 30 Tage)
marc
marc am 22 Mai 2019
Kommentiert: marc am 22 Mai 2019
Hey everyone. I wanted to calculate the distance matrix of "L" but answers are all NANs.what is the problem?
sc=zeros(1000,72);
%% WT :
V_ci=4;
V_r= 12;
V_co=25;
Nwt=25;
Pwr=2*Nwt;
for i=1:1000
for c=1:24
m = [9.9,9.3667,9.1667,9,8.7,8.6,9,9.0333,9.3333,9.6,10.1333,10.2667,7.9667,8,8,7.7333,6.9667,5.9667,4.8333,4.4333,4.3333,4.1000,4.0667,4];
sigma = [0.7937,0.8021,0.8505,0.8185,0.755,1.0583,1.1533,1.1504,0.9504,1.1533,1.0066,0.8622,0.3786,0.4583,0.5,0.4509,0.2309,0.3786,0.3215,0.3215,0.4163,0.2646,0.2082,0.1732];
m_v=m(c);
sigma_v=sigma(c);
shape=(sigma_v/m_v)^(-1.086);
scale=m_v/gamma(1+1/shape);
sc(i,c)=wblrnd(scale,shape);
end
end
%% PV :
Npv=100000;
PF_pv=1;
for i=1:1000
for d=25:48
mu=[zeros(1,24),0,0,0,0,0.032,0.1278,0.2538,0.3824,0.4908,0.5680,0.6164,0.5990,0.5614,0.4672,0.3548,0.2228,0.1030,0,0,0,0,0,0,0];
sd=[zeros(1,24),0,0,0,0,0.0045,0.0406,0.0714,0.1189,0.1388,0.1659,0.1445,0.1175,0.0995,0.0788,0.0550,0.0410,0.0276,0,0,0,0,0,0,0];
mu_pv=mu(d);
sd_pv=sd(d);
beta=(1-mu_pv)*(mu_pv*(1-mu_pv)/sd_pv^2-1);
alfa=mu_pv*beta/(1-mu_pv);
sc(i,d)=betarnd(alfa,beta);
end
end
%% load
for i=1:1000
for f=49:72
sc(i,f)=0.9+0.2*betarnd(2,2);
end
end
M=zeros(1,72);
M = max(sc,[],1); % finding maximum array in each column
L=zeros(1000,72);
b=1;
for i=1:1000
for t=1:72
L(i,t)=sc(i,t)/M(b,t);
end
end
%% distance
N = size(L,1);
q(N,N) = 0;
for i = 1:(N-1)
X = ones((N-i),1)*L(i,:);
q((i+1):N,i) = sqrt( sum((X - L((i+1):N,:)).^2,2) );
end
D =q + q';

Akzeptierte Antwort

Adam Danz
Adam Danz am 22 Mai 2019
Bearbeitet: Adam Danz am 22 Mai 2019
First, two take-home messages
  • 0/0 = nan
  • Once you have a NaN in your data, it potentially spreads like wildfire
The NaN is first appearing in your 2nd i-for-loop in this line below because you're dividing zero by zero (which equals NaN) and then multiplying NaN by whatever which also equals NaN. So beta equals NaN.
beta=(1-mu_pv)*(mu_pv*(1-mu_pv)/sd_pv^2-1);
% |_____0________/__0__|
By the time you are out of those nested loops, you've got 11000 NaNs in your sc array.
sum(isnan(sc(:))) % = 11000
Since subsequent lines of code uses sc, those NaNs propagate through the rest of your code.
  3 Kommentare
Adam Danz
Adam Danz am 22 Mai 2019
To avoid those NaNs, you need to avoid dividing zero by zero (0/0).
mu=[zeros(1,24),0,0,0,0,0.032,0.1278,0.2538,0.3824,0.4908,0.5680,0.6164,0.5990,0.5614,0.4672,0.3548,0.2228,0.1030,0,0,0,0,0,0,0];
sd=[zeros(1,24),0,0,0,0,0.0045,0.0406,0.0714,0.1189,0.1388,0.1659,0.1445,0.1175,0.0995,0.0788,0.0550,0.0410,0.0276,0,0,0,0,0,0,0];
These vectors (above) contain 0s and your code is using those zeros. I have no idea what those variables represent or why you're dividing them. It's up to you to figure that out. Maybe the NaNs should be there or maybe they're a sign that something's wrong.
There are lots of inefficiencies in your code including
  • hard coded variables such as m = [9.9,9.3667...]; it would be better to load that data from its source rather than hard coding it.
  • Many parts of your for-loops (or perhaps all of the for-loops) can be replaced with vectorization.
  • Instead of looping from d=25 to d=48 and then offsetting the vectors with 24 zeros, why not just loop from 1 to 23?
In any case, I recommend stepping through your code, line by line, asking yourself the purpose of each line of code and whether it is serving its purpose correctly.
marc
marc am 22 Mai 2019
thank you for your answer

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by