Why do I get an invalid text character error?

10 views (last 30 days)
Eric on 5 May 2023
Commented: Walter Roberson on 6 May 2023
Hello! Here is the code:
V1 = [-3 20 3];
V2 = [3 10 3.5];
V3 = [-123 32 34];
syms vx vy vz real
vslk = [vx ; vy ; vz];
vfl = simplify(norm(vskl));
alfa = acos(vx/vfl);
beta = acos(vy/vfl);
gama = acos(vz/vfl);
for i=1:3
disp (['vectorul', num2str(i), ':']);
VX = eval(['V',i]);
vxn = VX(1);
vyn = VX(2);
vzn = VX(3);
vn=eval(subs(vfl, [vx vy vz], [vxn vyn vzn]));
disp(['modulul vectorului ', num2str(i), ': ', num2str(vn)]);
alfan = rad2deg(eval(subs(alfa, [vx vy vz], [vxn vyn vzn])));
betan = rad2deg(eval(subs(beta, [vx vy vz], [vxn vyn vzn])));
gaman = rad2deg(eval(subs(gama, [vx vy vz], [vxn vyn vzn])));
disp(['unghiul alfa al vectorului ', num2str(i), ': ', num2str(alfan), ' grade']);
disp(['unghiul beta al vectorului ', num2str(i), ': ', num2str(betan), ' grade']);
disp(['unghiul gama al vectorului ', num2str(i), ': ', num2str(gaman), ' grade']);
end
It gives me the following error:
Error using untitled4
Error: Invalid text character. Check for unsupported symbol, invisible
character, or pasting of non-ASCII characters.
How can I see which line has a problem?

Walter Roberson on 5 May 2023
for i=1:3
i will contain numeric values.
VX = eval(['V',i]);
When you use the [] operator between a character vector and a number, then the result is the same as if you had done
VX = eval(['V',char(i)]);
char(1) does not give you '1' (the character for the digit 1) as a result. char(1) gives you the character whose Unicode Code Point is 1 -- the second Unicode character (first is code point 0). That character is traditionally referred to as SOH, Start of Heading; https://www.compart.com/en/unicode/U+0001
How do you fix this problem? Easy: Don't Use eval.
V1 = [-3 20 3];
V2 = [3 10 3.5];
V3 = [-123 32 34];
Vs = {V1, V2, V3};
for i=1:3
disp (['vectorul', num2str(i), ':']);
VX = Vs{i};
Walter Roberson on 5 May 2023
There is no documented eval() function for symbolic expressions.
vn=eval(subs(vfl, [vx vy vz], [vxn vyn vzn]));
could do pretty much anything and it would not be a "bug" because the behaviour is not defined by Mathworks.
In practice, eval() of a symbolic expression is treated the same as eval() of char() of the symbolic expression, as if you had written
vn=eval(char(subs(vfl, [vx vy vz], [vxn vyn vzn])));
That might sound reasonable at first, but the problem is that the char() of a symbolic expression is mostly for display purposes, and is not certain to happen to be valid syntax for internal symbolic expressions and is not certain to happen to be valid syntax for MATLAB. There are also some cases where the parameters for symbolic functions are in a different order than the parameters for the similarly-named numeric function; for example historically the parameters for the symbolic function beta were different than the order for the numeric function beta. Using char() produces a human-readable representation, and is not designed to produce something that can be executed numerically.
So, do not use eval() on symbolic expressions. It is undefined, and will give you error messages in some cases, and will silently succeed but give you undesired results in other cases.
Use subs() instead to get down to symbolic numbers, and then double() the symbolic number to get a double precision number.

Atsushi Ueno on 5 May 2023
You should change the value i to string data.
VX = eval(['V',num2str(i)])
Walter Roberson on 6 May 2023
To be fair, for this particular operation, selecting one of the V1, V2, V3 variables, that part does not involve any operations on symbolic expressions. The
vn=eval(subs(vfl, [vx vy vz], [vxn vyn vzn]));
is a different part of the code. eval() is being abused in two different ways in the original code.

Categories

Find more on Number Theory in Help Center and File Exchange

R2022b

Community Treasure Hunt

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

Start Hunting!