Why do I get an invalid text character error?

17 次查看(过去 30 天)
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?

回答(2 个)

Walter Roberson
Walter Roberson 2023-5-5
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};
  1 个评论
Walter Roberson
Walter Roberson 2023-5-5
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
Atsushi Ueno 2023-5-5
You should change the value i to string data.
VX = eval(['V',num2str(i)])
  1 个评论
Walter Roberson
Walter Roberson 2023-5-6
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.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Number Theory 的更多信息

产品


版本

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by