why it does not go to if statement and not only in else?(variable 'omega' might be set by a nonscalar operator)

3 views (last 30 days)
clc
Longitude=39.1925; % East
Latitude=21.4858; %North
LST=[6:18]
for d=[21 52 80 111 141 172 202 233 264 294 325 355]
omega=15.*(LST-12)
delta=23.45.*sind((360/365).*(284+d))
alpha=asind(cosd(Latitude).*cosd(delta).*cosd(omega)+sind(Latitude).*sind(delta))
thetaz=90-alpha
if omega>0
gammas=360-acosd((sind(delta).*cosd(Latitude)-cosd(delta).*sind(Latitude).*cosd(omega))./cosd(alpha))
else
gammas=acosd((sind(delta).*cosd(Latitude)-cosd(delta).*sind(Latitude).*cosd(omega))./cosd(alpha))
end
plot(gammas,alpha,'linewidth',2);
hold on
xlabel('Solar Azimuth','fontsize',14)
ylabel('Solar Elevation (Altitude)','fontsize',14)
title('Sun Path Chart','fontsize',14)
fh = figure(1);
set(fh, 'color', 'white');
end

Answers (2)

Geoff Hayes
Geoff Hayes on 15 Mar 2022
@Abdulmuti Ehsan omega is an array
omega=15.*(LST-12)
where
LST=[6:18]
. So for the condition
if omega>0
what do you mean this to be? Should all elements in omega be greater than zero (which won't be the case) or do you want to be iterating over omega (somehow)?

Steven Lord
Steven Lord on 15 Mar 2022
From the documentation page for the if keyword: "if expression, statements, end evaluates an expression, and executes a group of statements when the expression is true. An expression is true when its result is nonempty and contains only nonzero elements (logical or real numeric). Otherwise, the expression is false."
That means if your expression results in a non-scalar value the body of the if statement is only executed if the expression results in a non-empty result and all the elements in that result are true. In your case, with if omega > 0, if any of the values of omega are not strictly greater than 0, the if statement is not satisfied.
What are your omega values? Are any of them not greater than 0?
LST=[6:18]
LST = 1×13
6 7 8 9 10 11 12 13 14 15 16 17 18
omega=15.*(LST-12)
omega = 1×13
-90 -75 -60 -45 -30 -15 0 15 30 45 60 75 90
Yes, there are several that are not greater than 0.
You could iterate over the elements in omega or you could use logical indexing to operate first on those values of omega that are positive and then those that aren't.
y = NaN(size(omega));
positive = omega > 0;
y(positive) = omega(positive).^2;
negative = omega < 0;
y(negative) = sind(omega(negative));
format longg
y.' % Transpose to make it easier to see more of y at once
ans = 13×1
1.0e+00 * -1 -0.965925826289068 -0.866025403784439 -0.707106781186548 -0.5 -0.258819045102521 NaN 225 900 2025

Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

Tags

Products

Community Treasure Hunt

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

Start Hunting!