【问题标题】:Reading zero-values in MatLab during loop在循环期间读取 MatLab 中的零值
【发布时间】:2023-03-24 02:56:01
【问题描述】:

我在尝试运行循环时在 MatLab 中遇到了问题。对于循环中的每次迭代,计算 3x3 矩阵的特征值和特征向量(每次迭代的矩阵不同)。此外,每次迭代都应始终产生一个 [0 a 0] 形式的特征向量,其中只有中间值 a 不为零。

我需要获取发生这种情况的特征向量矩阵的列的索引。为此,我在主循环(生成矩阵的位置)中设置了以下循环:

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

在这种情况下,MatLab 不会为 index_sh 分配任何值,即使我希望 index_sh 在这种情况下等于 1。

如果有人知道我可以如何解决这个问题,那么当零写成 0.0000 时,MatLab 也会分配一个值,我将非常感激!

【问题讨论】:

  • 看起来像通常的浮点精度问题。使用公差。见stackoverflow.com/questions/686439/…
  • 谢谢。你知道我该如何解决这个问题吗?
  • 尝试使用特征向量(1,i)==0.0。告诉我它是否有效。另一种选择是使用 any(eigenvectors(1,i)) 作为条件。我还怀疑在你的情况下元素是非零的,所以我最好使用 abs(eigenvectors(1,i)) 这样的条件
  • 非常感谢,兄弟。

标签: matlab loops zero


【解决方案1】:

问题很可能是那些“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,:)));

【讨论】:

  • @Kristian Welcome :-) 查看编辑,避免使用容差
  • 是的,我注意到了 :)。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多