Why do I get undefined variable in an if statement?
14 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
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 Commenti
Adam
il 30 Ott 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.
Risposta accettata
KL
il 30 Ott 2017
Modificato: KL
il 30 Ott 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 Commenti
Robert
il 30 Ott 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
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Matrix Indexing in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!