Why do I get undefined variable in an if statement?
8 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi everyone, I get an error for undefined function or variable in the if statement, when I have already assigned the equalities.
l_min = nan(372,1);
A = randn(372,2);
B= randn(372,3);
for t=1:372
min_ct = min( A(t,:));
if min_ct == A(t,1);
l = B(t,1);
if min_ct == A(t,2);
l = B(t,2);
elseif min_ct == A(t,3);
l = B(t,3);
end
end
l_min(t) = l;
end
Could anyone help with this one?
2 commentaires
Adam
le 30 Oct 2017
What is the actual error message and which line does it point to? Your indenting of the code is a bit confusing, but 'l' is not defined on all paths so far as I can see - i.e. if min_ct ~= A(t,1) then it is undefined because the other if statements sit inside the first one.
Réponse acceptée
KL
le 30 Oct 2017
Modifié(e) : KL
le 30 Oct 2017
You create l inside if statements, so if none of the condition is fulfilled, then l goes undefined and when you try to access it outside that block, it throws an error.
But anyway, I noticed some other things, A only has 2 columns but you say,
min_ct == A(t,3); % I suppose A also has 3 columns
and to find minimum along columns, you could simply use (no need for loop),
[min_ct, ind_min_ct] = min(A,[],2);
now ind_min_ct has all the indices you can simply say use it to find l and l_min
3 commentaires
Robert
le 30 Oct 2017
I think KL got it right. ind_min_ct is now the column index of the minimum value in each row. It is simple to use this to extract the corresponding values of B.
For your data
A = randn(372, 3);
B = randn(372, 3);
You could use
[~, idx] = min(A, [], 2);
l_min = nan(372, 1);
for t = 1:372
l_min(t) = B(t, idx(t));
end
or better still
[~, idx] = min(A, [], 2);
l_min = B(sub2ind(size(B), (1:372)', idx));
That last snippet runs around 10x faster than your original code (which I interpreted as the following)
l_min = nan(372, 1);
for t = 1:372
min_ct = min( A(t, :));
if min_ct == A(t, 1)
l = B(t, 1);
elseif min_ct == A(t, 2)
l = B(t,2);
elseif min_ct == A(t, 3)
l = B(t, 3);
end
l_min(t) = l;
end
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Matrix Indexing 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!