Why do I get undefined variable in an if statement?
14 views (last 30 days)
Show older comments
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 Comments
Adam
on 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.
Accepted Answer
KL
on 30 Oct 2017
Edited: KL
on 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 Comments
Robert
on 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
More Answers (0)
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!