I have tried searching for an answer on this, but can't find one that specifically addresses my issue. Although vectorizing in MATLAB must draw many questions in, the problem I am having is less general than typical examples I have found on the web. My background is more in C++ than MATLAB, so this is an odd concept for me to get my head around.
I am trying to evolve a Hamiltonian matrix from it's initial state (being a column vector where all elements but the last is a 0, and the last is a 1) to a final state as time increases. This is achieved by sequentially applying a time evolution operator U to the state. I also want to use the new state at each time interval to calculate an observable property.
I have achieved this, as can be seen in the code below. However, I need to make this code as efficient as possible, and so I was hoping to vectorize, rather than rely on for loops. However, I am unsure of how to vectorize this code. The problem I have is that on each iteration of the for loop, the column vector psi should change its values. Each new psi is then used to calculate my observable M for each interval of time. I am unsure of how to track the evolution of psi such that I can end up with a row vector for M, giving the outcome of the application of each new psi.
time = tmin:dt:tmax;
H = magic(2^N)
X = [0,1;1,0]
%%% INITIALISE COLUMN VECTOR
init = sparse(2^N,1);
init(2^N) = 1;
%%% UNITARY TIME EVOLUTION OPERATOR
U = expm(-1i*H*dt);
%%% TIME EVOLVUTION
for num = 1:length(time)
psi = U*init;
init = psi;
%%% CALCULATE OBSERVABLE
M(num) = psi' * kron(X,speye(2^(N-1))) * psi
end
Any help would be greatly appreciated.
X
inM(num) = psi' * kron(X,speye(2^(N-1))) * psi
? – rahnema1X
is undefined. You may be prematurely optimizing. Get your code working and verified with a loop first. Also,for
loops are not necessarily slow and integration problems like this are often best solved with a loop (though there are ways to remove the loop for simple cases like this). – horchler