仿射变换的替代方式/应用?

时间:2018-01-18 16:29:25

标签: matlab matrix affinetransform

这里的问题很复杂,但我会试着清楚地解释一下这句话;

情况

我有一个代码,其中(协方差)矩阵A通过添加(生成/给定)矩阵B进行转换,然后将其除以某个值:

A_new = (A_old + B) / constant

此转换包括扩展& 轮播,没有翻译。 这是一种转换矩阵的不同方式,而不是我习惯的(which is like this

我想要什么

我想以这样的方式分解/重新组合矩阵B,即它对矩阵A执行旋转,但 缩放矩阵A(特征向量相同长度)

在常规仿射变换中,它将涉及something like this,但由于变换矩阵的替代方法(如上所述),这不适用。

解决方案,艰难的方式

我能做的一件事是:

  1. 确定矩阵A_new和矩阵A_old
  2. 中的特征向量的方向
  3. 计算方向差异
  4. 创建旋转矩阵R
  5. 计算A_new = A_old*R
  6. 但是,有没有更简单的方法?通过调整A_new = (A_old + B) / constant中的矩阵B,可以帮助我解决的任何建议(或关键字)只能 旋转?

    提前致谢!

    编辑: 添加了代码:

        for k=1:m0.nbStates
            %Update the centers
            Mu(:,k) = (Mu0(:,k).*Ek0(k) + NewData*Pix(:,k)) / (Ek0(k)+Ek(k));
    
            %Update the covariance matrices
            S1 = zeros(m0.nbVar,m0.nbVar);
            for j=1:nbData
                dx = NewData(:,j)-Mu(:,k);
                S1 = S1 + (dx)*(dx)'.*Pix(j,k);
            end
            dx0 = Mu0(:,k)-Mu(:,k);
            S2 = (Sigma0(:,:,k)+(dx0)*(dx0)').*Ek0(k);
            Sigma(:,:,k) = (S1 + S2) / (Ek0(k)+Ek(k));
        end
    

    上述方法是高斯混合模型直接更新方法。当新数据可用时,它会更新高斯分布。对于我的研究,我想调整高斯人的(2D)方向而不是他们的大小。

    改变高斯混合模型的第二种方法如下:

    % Implementation of incremental learning algorithm, as described by
    % Rafael Pinto and Paulo Engel in their paper:
    % "Scalable and Incremental Learning of Gaussian Mixture Models" (2017)
    
    v1   = v0+1;         %Eq 4.
    sp1  = sp0+P_jx;     %Eq 5.
    e_j  = X - Mu0;      %Eq 6.
    w_j  = P_jx / (sp1+realmin);   %Eq 7.
    dMu  = w_j*e_j;      %Eq 8.
    Mu1  = Mu0 + dMu;    %Eq 9.
    e_j  = X - Mu1;      %Eq10.
    
    Sigma1 = (1-w_j)*Sigma0+w_j*(e_j*e_j')-dMu*dMu';
    

    此方法还通过添加第二项来将协方差矩阵“Sigma0”调整为“Sigma1”。

0 个答案:

没有答案