我在MatLab中遇到了一个问题,因为我试图运行一个循环。对于循环中的每次迭代,计算3×3矩阵的特征值和特征向量(矩阵随每次迭代而不同)。此外,每次迭代应始终产生一个形式为[0 a 0]的特征向量,其中只有中间值a为非零。
我需要获得特征向量矩阵的列的索引。为此,我在main-loop(生成矩阵)中设置了以下循环:
for i = 1:3
if (eigenvectors(1,i)==0) && (eigenvectors(3,i)==0)
index_sh = i
end
end
问题是所讨论的特征向量矩阵有时会产生以下形式的输出:
eigenvectors =
-0.7310 -0.6824 0
0 0 1.0000
0.6824 -0.7310 0
在这种情况下,我的代码效果很好,我得到index_sh = 3.
但是,有时矩阵的形式如下:
eigenvectors =
0.0000 0.6663 0.7457
-1.0000 0.0000 0.0000
-0.0000 -0.7457 0.6663
在这种情况下,即使我希望index_sh
在这种情况下等于1,MatLab也不会为index_sh
分配任何值。
如果有人知道如何解决这个问题,那么当零写为0.0000
时,MatLab也会分配一个值,我将非常感激!
答案 0 :(得分:2)
问题很可能是那些" 0.0000
"并不完全是0
。要解决这个问题,请选择公差并在与0比较时使用它:
tol = 1e-6;
index_sh = find(abs(eigenvectors(1,:))<tol & abs(eigenvectors(3,:))<tol);
在您的代码中:
for ii = 1:3
if abs(eigenvectors(1,ii))<tol && abs(eigenvectors(3,ii))<tol
index_sh = i
end
end
或者,您可以选择第一行和第三行条目更接近0的列,而不是容差:
[~, index_sh] = min(abs(eigenvectors(1,:)) + abs(eigenvectors(3,:)));