MATLAB Answers

Element-wise power resulting in imaginary values and NAN

5 views (last 30 days)
MathN00b
MathN00b on 23 Jan 2020
Commented: Walter Roberson on 25 Jan 2020
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
Have you shadowed the .^ operator? What does this show
which power
Walter Roberson
Walter Roberson on 24 Jan 2020
Could you attach the script that is triggering the problem?
MathN00b
MathN00b on 25 Jan 2020
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
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
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.