【问题标题】:Stopping the iteration of all the elements of a vector at convergence in matlab?在matlab收敛时停止向量的所有元素的迭代?
【发布时间】:2015-08-24 08:06:05
【问题描述】:

我想迭代矩阵中的所有元素,并希望它们在所有元素的值收敛时停止。我编写了代码(如下),但它给了我错误的值,我不认为值是否真的在循环中。

probability = (ones(1,2048) .* 1/2048); %vector of 2048 values
Tij = sum(StateTransitionfwd); %vector of 2048 values
Tji = sum(StateTransitionbwd); %vector of 2048 values
p = ((Tji .* probability) - (Tij .* probability)); %vector of 2048 values

threshold = (zeros(1,2048)); %vector of 2048 values
old = p; %vector of 2048 values
new = zeros(1,2048); %vector of 2048 values

while old - new > threshold %subtracting vector from the vector    
   old = p;     
   p = ((p * StateTransitionbwd) - (Tij .* p));     
   new = p;        
end 

【问题讨论】:

  • 我认为你的数组永远不会收敛到零,因此总是运行。尝试将阈值设置得更高或在您的 while 循环条件中包含最大迭代次数。
  • @Visser 我试过这样做。值并没有首先进入循环,而是通过使用 norm(old - new) 进入循环。但现在我得到了 Inf 或 NaN 的值:s
  • Tij 和 Tji 都是标量。将它们与概率相乘得到一个包含 2048 个完全相同的值的数组。再次减去这两个数组会得到一个包含完全相同条目的 2048 元素数组。只有当您在 while 循环中分配 p 时,事情才会开始发生变化,提供 StateTransitionbwd 是一个 2048 个不同值的数组。
  • 元素的数量保持不变(即 2048),但它们的值是 NaN 或 inf。

标签: matlab loops iteration convergence


【解决方案1】:

您的停止条件old - new > threshold 是有问题的,因为它不是被评估为一个标量布尔值,而是一个布尔值的向量
您应该改为测量差异向量的 norm,例如

while max( abs( old-new) ) > threshold

或者

while norm( old-new) > threshold

【讨论】:

  • 循环工作并且值至少在循环中。但输出是 NaN 或负 Infinty :s
【解决方案2】:

在我看来,您的旧向量也可能是 0 向量。如果在测试循环条件时遇到 NaN 或 inf 错误,那是因为您尝试使用 norm(old-new) 找到零向量的范数。向量的范数由 v/||v|| 计算所以如果 ||v||为 0,您的向量将为 NaN。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    相关资源
    最近更新 更多