在循环过程中读取MatLab中的零值
当我尝试运行循环时,在MatLab中遇到了一个问题。对于循环中的每个迭代,计算3x3矩阵的特征值和特征向量(每个迭代的矩阵不同)。此外,每次迭代应始终产生一个形式为[0 a 0]的特征向量,其中只有中间值a为非零 我需要得到出现这种情况的特征向量矩阵列的索引。为此,我在主循环(生成矩阵的地方)中设置了以下循环: 问题在于,所讨论的特征向量矩阵有时会有以下形式的输出:在循环过程中读取MatLab中的零值,matlab,loops,zero,Matlab,Loops,Zero,当我尝试运行循环时,在MatLab中遇到了一个问题。对于循环中的每个迭代,计算3x3矩阵的特征值和特征向量(每个迭代的矩阵不同)。此外,每次迭代应始终产生一个形式为[0 a 0]的特征向量,其中只有中间值a为非零 我需要得到出现这种情况的特征向量矩阵列的索引。为此,我在主循环(生成矩阵的地方)中设置了以下循环: 问题在于,所讨论的特征向量矩阵有时会有以下形式的输出: eigenvectors = -0.7310 -0.6824 0 0
eigenvectors =
-0.7310 -0.6824 0
0 0 1.0000
0.6824 -0.7310 0
eigenvectors =
0.0000 0.6663 0.7457
-1.0000 0.0000 0.0000
-0.0000 -0.7457 0.6663
在这种情况下,我的代码运行良好,我得到索引\u sh=3。
但是,有时矩阵的形式是:
eigenvectors =
-0.7310 -0.6824 0
0 0 1.0000
0.6824 -0.7310 0
eigenvectors =
0.0000 0.6663 0.7457
-1.0000 0.0000 0.0000
-0.0000 -0.7457 0.6663
在这种情况下,MatLab不会给index_sh
赋值,即使在这种情况下我希望index_sh
等于1
如果有人知道我如何解决这个问题,那么当0被写成
0.0000
时,MatLab也会赋值,我将非常感激 问题很可能是那些“0.0000
”并不完全是0
。要解决此问题,请选择一个公差,并在与0进行比较时使用它:
tol = 1e-6;
index_sh = find(abs(eigenvectors(1,:))<tol & abs(eigenvectors(3,:))<tol);
看起来像是常见的浮点精度问题。使用公差。再见,谢谢。你知道我该怎么解决这个问题吗?试着用特征向量(1,I)==0.0。告诉我它是否有效。另一种选择是使用任何(特征向量(1,i))作为条件。我还怀疑在你的例子中元素是非零的,所以我最好使用像abs(特征向量(1,I))这样的条件。非常感谢,弗洛伊德。@Kristian Welcome:-)参见编辑,它避免了使用公差是的,我注意到了:)。再次感谢!
[~, index_sh] = min(abs(eigenvectors(1,:)) + abs(eigenvectors(3,:)));