二维矩阵中列的 Matlab 向量化和单元素乘法

计算科学 matlab 矩阵 矢量化
2021-12-17 03:07:46

MATLAB。

我正在尝试向量化一个循环,其中通过将对角矩阵中的每个单个元素与另一个 n×n 2D 矩阵中的列向量相乘来找到 2D 矩阵(n×n)的每个列向量。看起来矢量化很简单,但我一定遗漏了一些东西。我尝试先将对角矩阵转换为列向量,但它仍然需要一次执行一个元素的操作。

先感谢您。

%% example matrix
B = [ 3     2      .9    2
      2      4       1    2
      3      4      -1    0
     .5     .5      .1    1];

%% find eigenvectors and eigenvalues
 [ve, va] = eig(B,'nobalance');

%% get size of B ... 4
    [~,q]=size(B);

%% time constants
    t0=0;
    t = 2000e-6;

%% pre-allocate memory for Matrix Mn (Mnew) and Mp (Mprime)
    Mn=zeros(q,1);
    Mp=Mn;

%% Original code, runs correctly, not vectorized - steps through each column
for m = 1:q,
    Mn(:,m) = exp( va(m,m) * t0) * ve(:,m);             
    Mp(:,m) = exp( va(m,m) * t ) * ve(:,m);            
end

% quick explanation ^ for each column of Mn and Mp, a single value
% exp(va(i,i)*t) is multiplied by a column of ve(:,i)
% vectorizable?
% Mn(column) = A * ve(column), but A is an individual element in a different vector already

%% New code... vectorized?
% random starting idea:
va1 = va * [1; 1; 1; 1];  % changes diagonal matrix into column vector of values, BUT still has to calculate one at a time...
2个回答

首先你想要特征值作为一个向量,即

va = diag(va);

或者只是使用输出选项调用eig :

[ve, va] = eig(B,'nobalance','vector');

然后将列相乘,您可以使用对角矩阵乘法

Mp = ve*diag(exp(va*t));

或 bsxfun:

Mp = bsxfun(@times,ve,exp(va*t)');

以下代码的结果等价于for loop

Mp=(exp( diag(va) * t ))' .* ve;
Mn=(exp( diag(va) * t0 ))' .* ve;