Can't apply an IF function with 100000*1 matrix

1 vue (au cours des 30 derniers jours)
Alexandra
Alexandra le 4 Juin 2015
Commenté : Alexandra le 5 Juin 2015
Hi! I built this code:
if A1 <0
D = 0.8;
elseif A2 <0
D = 0.7;
elseif A3 <0
D = 0.6;
elseif A4 <0
D = 0.5;
else
D = 0.3;
end
My problem is that A1, A2, A3 and A4 are 100000x1 matrixes from Monte Carlo Simulations so I would expect D to be 100000x1 too. Instead I get a flat value like 0.8. What I am doing wrong? The strange part is that it works when test with a 5x1 matrix. Thanks a lot.

Réponse acceptée

James Tursa
James Tursa le 4 Juin 2015
Modifié(e) : James Tursa le 4 Juin 2015
To make your code work, wrap a loop around it. E.g.,
D = zeros(size(A1));
n = numel(D);
for k=1:n
if A1(k) <0
D(k) = 0.8;
elseif A2(k) <0
D(k) = 0.7;
elseif A3(k) <0
D(k) = 0.6;
elseif A4(k) <0
D(k) = 0.5;
else
D(k) = 0.3;
end
end
Or perhaps you might use a vectorized approach. E.g.:
D = 0.3 * ones(size(A1));
D(A4<0) = 0.5;
D(A3<0) = 0.6;
D(A2<0) = 0.7;
D(A1<0) = 0.8;
  1 commentaire
Alexandra
Alexandra le 5 Juin 2015
Thanks a lot. I wrapped the loop and it did work!

Connectez-vous pour commenter.

Plus de réponses (1)

Kelly Kearney
Kelly Kearney le 4 Juin 2015
When applied to a vector, if x < 0 is the same as if all(x < 0). It doesn't iterate over the vector, and therefore it returns the single scalar value that you assign.
You need to either loop over all the values, or use logical indexing instead:
D = ones(size(A1)) * 0.3;
D(A1 < 0) = 0.8;
D(A1 >= 0 & A2 < 0) = 0.6;
D(A1 >= 0 & A2 >= 0 & A3 < 0) = 0.4;
D(A1 >= 0 & A2 >= 0 & A3 >= 0 & A4 < 0) = 0.5;

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by