logm and expm function

Hi there,
%If we consider a diagnal matrix defined as:
delta=diag(exp(1i*2*pi*(0:10)/11));
%and we define another matrix C as:
C=diag(1i*2*pi*(0:10)/11);
%so, if we compute this:
D=logm(delta);
%D should be equal to C, right? but the result is not, part of elements in D is equal to C but not all of them. I can't fix this issue.
Many thanks to you!
Charlie

2 Comments

Edit - Check Walter Roberson's answer for more details on the question.
In your matrix delta, all terms except for the diagonal terms are 0. And thus using logm() would not be ideal.
delta=diag(exp(1i*2*pi*(0:10)))
delta =
1.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 - 0.0000i
Though you can use expm() on C and compare it with delta
C=diag(1i*2*pi*(0:10));
D=expm(C);
isequal(delta,D)
ans = logical
1
DDDD
DDDD on 13 Sep 2022
thank you for your answer, I make sense now!

Sign in to comment.

 Accepted Answer

The problem you are running into is that you are assuming that log(exp(X)) == X for all X. However, that is only true for real numbers. For complex numbers, with the sin() going on, values are mapped to the primary branch. exp(2i*pi*N) for integer N is going to involve 1i*sin(2*pi*N) which is going to have a complex part of 0 for all integer N.
format long g
Pi = sym(pi);
%If we consider a diagnal matrix defined as:
delta = diag(exp(1i*2*Pi*(0:10)))
delta = 
%and we define another matrix C as:
C = diag(1i*2*Pi*(0:10))
C = 
%so, if we compute this:
D=logm(delta)
D = 
C - D
ans = 

7 Comments

thank you for you answer! Actually I was tring to apply exp(log(X))=X for X is a square matrix. As you mentioned, this is only true for X is real matrix which I didn't know before. May I ask another question?
%if we have a circular forward cyclic matrix
P=circshift(eye(8),1);
%and can we apply exp(log(X))?
L=expm(logm(P));
%if I run this on matlab, L will be very close to P with error in 10^(-15) level; but, from wiki, only when ||P-I|| < 1 then can say exp(log(P))=P but indeed here ||P-I|| > 1. So I not sure if this 10^(-15) error is from matlab calculation or we can't say L=P.
Bruno Luong
Bruno Luong on 13 Sep 2022
Edited: Bruno Luong on 13 Sep 2022
@mingcheng nie you make few mistake sin your text:
expm(logm(X)) is always equal to X (by definition). however logm(expm(X)) might differ to X.
"or we can't say L=P."
L=expm(logm(P)) is equal to P, error is only due to finite precision numerical calculation.
The wiki says that the power series of logm(X) exists for ||X-I|| < 1. It does not says anything about logm.
The logm exists even for any X, see the calculation with diagonalize/jordaalize in bottom of the wiki.
DDDD
DDDD on 13 Sep 2022
Thank you so much for the useful answers I really appreciate it!!! Now I make sense and thank you again to point out my mistakes!!!
Moreover, may I know why logm(expm(X)) might not be X?
Because you always land on the principal branch of the logarithm:
syms x
x = sym('5')*pi*1i;
y = logm(expm(x))
y = 
Read here what principal value and principal branch mean:
"may I know why logm(expm(X)) might not be X"
Because two distincs X can have the same value exp(X): example X1 = 2*pi*1i, X2 = 0. The log function selects one of these by convention
X1 = 2*pi*1i
X1 = 0.0000 + 6.2832i
expm(X1) % = exp(X) is 1
ans = 1.0000 - 0.0000i
logm(1) % logm(expm(X1)) % = log(1) = X2 = 0
ans = 0
DDDD
DDDD on 13 Sep 2022
what if we set
delta=diag(exp(1i*2*pi*(0:10)/11));
then
C=diag(1i*2*pi*(0:10)/11);
as delta vary from 0 to 10/11, we might not get the N is integer, so I think the expm(C) == delta right?
expm(diag(v)) = diag(exp(v))
for every vector v.
Here, you have no restrictions.
v = [log(675) log(i) log(-8)];
expm(diag(v))
ans =
1.0e+02 * 6.7500 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0100i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i -0.0800 + 0.0000i
diag(exp(v))
ans =
1.0e+02 * 6.7500 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0100i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i -0.0800 + 0.0000i

Sign in to comment.

More Answers (0)

Products

Release

R2022a

Asked:

on 13 Sep 2022

Edited:

on 13 Sep 2022

Community Treasure Hunt

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

Start Hunting!