Matlab不返回特征向量的正交矩阵

时间:2015-10-21 11:28:05

标签: matlab matrix linear-algebra eigenvector eigenvalue

当我试图在Matlab中找到具有重复特征值但没有缺陷的矩阵的特征分解时,它不返回eignevectors的标准正交矩阵。例如:

public void CaptureImages(View v) {
    mSurfaceView.setDrawingCacheEnabled(true);

    mSurfaceView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    mSurfaceView.layout(0, 0, mSurfaceView.getMeasuredWidth(), mSurfaceView.getMeasuredHeight());
    mSurfaceView.buildDrawingCache(true);
    Bitmap bitmap = Bitmap.createBitmap(mSurfaceView.getDrawingCache());
    mSurfaceView.setDrawingCacheEnabled(false);

    View v1 = findViewById(R.id.surfaceViewFrame);
    v1.setDrawingCacheEnabled(true);
    Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
    v1.setDrawingCacheEnabled(false);

    File folder = new File(Environment.getExternalStorageDirectory() + "/MediaApp");
    boolean success = true;
    if (!folder.exists()) {
        success = folder.mkdir();
    }
    if (success) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

        File fileImage = new File(Environment.getExternalStorageDirectory() + "/MediaApp"
                + File.separator + "image.jpg");
        FileOutputStream fo = null;

        try {

            fileImage.createNewFile();
            fo = new FileOutputStream(fileImage);
            fo.write(bytes.toByteArray());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    } else {
        showToast("Error Directory not created");
    }

}

我发现我的特征向量矩阵k = 5; repeats = 1; % First generate a random matrix of eignevectors that is orthonormal V = orth(rand(k)); % Now generate a vector of eigenvalues with the given number of repeats D = rand(k,1); for i = 1:repeats % Put one random value into another (note this sometimes will result in % less than the given number of repeats if we ever input the same % number) D(ceil(k*rand())) = D(ceil(k*rand())); end A = V'*diag(D)*V; % Now test the eignevector matrix of A [V_A, D_A] = eig(A); disp(V_A*V_A' - eye(k)) 不是正交的,即V_A不等于单位矩阵(考虑到舍入误差)。

我的印象是,如果我的矩阵是真实的并且是对称的,那么Matlab会返回一个特征向量的正交矩阵,那么这里有什么问题呢?

2 个答案:

答案 0 :(得分:10)

这似乎是一个数值精度问题。

实对称矩阵are orthogonal的特征向量。但是您的输入矩阵A并不完全对称。差异大约为eps,正如数值误差所预期的那样。

>> A-A.'
ans =
   1.0e-16 *
         0   -0.2082   -0.2776         0    0.1388
    0.2082         0         0   -0.1388         0
    0.2776         0         0   -0.2776         0
         0    0.1388    0.2776         0   -0.5551
   -0.1388         0         0    0.5551         0

如果您强制A 完全对称,您将获得正交V_A,最多为eps的数字错误:

>> A = (A+A.')/2;
>> A-A.'
ans =
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
>> [V_A, D_A] = eig(A);
>> disp(V_A*V_A' - eye(k))
   1.0e-15 *
   -0.3331    0.2220    0.0755    0.1804         0
    0.2220   -0.2220    0.0572   -0.1665    0.1110
    0.0755    0.0572   -0.8882   -0.0590   -0.0763
    0.1804   -0.1665   -0.0590         0   -0.0555
         0    0.1110   -0.0763   -0.0555         0

但令人惊讶的是,当V_A对称并且A 几乎对称时,A获得了截然不同的结果。这是我对正在发生的事情的打赌:noted by @ArturoMagidin

  

(1)对应于对称矩阵的不同特征值的特征向量必须彼此正交。对应于相同特征值的特征向量不需要彼此正交。

     

(2)但是,由于每个子空间都具有标准正交基,因此可以找到每个本征空间的标准正交基,因此可以找到特征向量的标准正交基。

仅当V_a是对称的时,Matlab可能正在采用路线(2)(因此强制A正交)。对于A不完全对称,它可能需要路由(1)并为您提供每个子空间的基础,但不一定是正交向量。

答案 1 :(得分:0)

当且仅当AA'= A'A且特征值不同时,实矩阵的特征向量才是正交的。如果特征值不明显,MATLAB选择正交的向量系统。在上面的例子中,AA'〜= A'A。此外,你必须考虑舍入和数值误差。