Matlab矢量化 - 矩阵的时间演化

时间:2017-10-18 17:29:03

标签: matlab vectorization

我试图在此搜索答案,但找不到专门解决我问题的答案。虽然在MATLAB中进行矢量化必须提出许多问题,但我遇到的问题不如我在网上找到的典型例子。我在C ++中的背景比MATLAB更多,所以这对我来说是一个奇怪的概念。

我正在努力将哈密顿量矩阵从它的初始状态(是一个列向量,其中所有元素,但最后一个是0,最后一个是1)随着时间的增加演变为最终状态。这是通过将时间演化算子U顺序地应用于该状态来实现的。我还想在每个时间间隔使用新状态来计算可观察的属性。

我已经实现了这一点,如下面的代码所示。但是,我需要使这段代码尽可能高效,所以我希望能够进行矢量化,而不是依赖于循环。但是,我不确定如何对此代码进行矢量化。我遇到的问题是,在for循环的每次迭代中,列向量psi应该改变它的值。然后,每个新的psi用于计算每个时间间隔的可观察量M.我不确定如何跟踪psi的演变,以便我最终得到M的行向量,给出每个新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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我很快就想出了以下部分矢量化代码:

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
% preallocate psi
psi = complex(zeros(2^N, length(time)));

% compute psi for all timesteps
psi(:,1) = U*init;
for num = 2:length(time)
    psi(:,num) = U*psi(:, num-1);    
end

% precompute kronecker product (if X is constant through time)
F = kron(X,speye(2^(N-1)));

%%% CALCULATE OBSERVABLE
M = sum((psi' * F) .* psi.', 2);

然而,问题中计算密集程度最高的部分似乎是psi的计算。为此,我无法看到任何明显的矢量化方式,因为它取决于上一步计算的值。

这一行: M = sum((psi' * F) .* psi.', 2);

是以矢量化方式计算psi(:,i)'*F*psi(:,i)的一个小小的Matlab技巧。