当我试图在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会返回一个特征向量的正交矩阵,那么这里有什么问题呢?
答案 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。此外,你必须考虑舍入和数值误差。