MATLAB Answers

Element-wise power resulting in imaginary values and NAN

54 views (last 30 days)
MathN00b
MathN00b on 23 Jan 2020 at 23:31
Commented: Walter Roberson on 25 Jan 2020 at 4:27
I am using element-wise power .^,which for A.^B should yield a matrix with elements A(i,j) raised to the power B(i,j). However, for the simple example:
A = [-1, 0; 0, -1];
B = [1, 0; 0, 1];
A.^B
I'm getting
ans =
-1.0000 + 0.0000i NaN + 0.0000i
NaN + 0.0000i -1.0000 + 0.0000i
If I use a loop, there is no error.
for i=1:2
for j =1:2
AB(i,j) = A(i,j)^B(i,j);
end
end
AB =
-1 1
1 -1
I can also select a single power coefficient and get the correct values, such as
A.^B(1,2)
ans =
1 1
1 1
What's wrong with the matrix element-wise power? Why is it giving out imaginary numbers and NaN for essentially 0^0, which should equal 1. Thanks.
EDIT: More Information on Replicating the Error
I tried to figure out why others can't replicate the errors I'm getting. After much frustration, I restarted the computer (Windows 10, R2018a) and tried it from a fresh instance, just copying and pasting the code into the Command Window, I get no error. However, if I run it from a script (e.g., script.m with the exact same code), then I get the error, and once it's errored, it can't be undone. Did some system settings change once I run it from an M file? I hope this helps to pinpoint the problem.
>> A = [-1, 0; 0, -1];
B = [1, 0; 0, 1];
A.^B
ans =
-1 1
1 -1
>> script
ans =
-1.0000 + 0.0000i NaN + 0.0000i
NaN + 0.0000i -1.0000 + 0.0000i
>> A = [-1, 0; 0, -1];
B = [1, 0; 0, 1];
A.^B
ans =
-1.0000 + 0.0000i NaN + 0.0000i
NaN + 0.0000i -1.0000 + 0.0000i

  10 Comments

Show 7 older comments
James Tursa
James Tursa on 24 Jan 2020 at 21:04
Have you shadowed the .^ operator? What does this show
which power
Walter Roberson
Walter Roberson on 24 Jan 2020 at 21:19
Could you attach the script that is triggering the problem?
MathN00b
MathN00b on 25 Jan 2020 at 3:41
Thank you for your help, Walter! The script contains the exact same code
A = [-1, 0; 0, -1];
B = [1, 0; 0, 1];
A.^B
I figured out the problem, thanks to James. One of the libraries contained a directory named @double with an alternative power.m file, which overloaded the default power function. I had no idea this is called when I used .^. It defined
o=power(s,t)
as
o=exp(log(s)*t);
or
o=exp(log(s).*t);
depending on the arguments. Thanks again for your patience and help, I really appreciate it.

Sign in to comment.

Accepted Answer

James Tursa
James Tursa on 24 Jan 2020 at 21:09
Looks like the problem calculation is being done in the background as exp(B.*log(A)), but I don't know why it does this sometimes and not other times.

  2 Comments

MathN00b
MathN00b on 25 Jan 2020 at 3:42
Thanks, James! One of the libraries contained a directory named @double with an alternative power.m file, which overloaded the default power function. I had no idea this is called when I used .^. It defined
o=power(s,t)
as
o=exp(log(s)*t);
or
o=exp(log(s).*t);
depending on the arguments. Much thanks!

Sign in to comment.

More Answers (0)

Sign in to answer this question.


Translated by