【问题标题】:for loop iteration-population conflictfor循环迭代-种群冲突
【发布时间】:2017-03-05 13:38:22
【问题描述】:

我是 python 新手,我正在尝试自己学习它。我目前正在编写一个代码,这给了我索引错误,因为不知何故 for 循环不会填充我的数据。我应该迭代一个值,并使用它,我依靠以前的值来产生新的值。通常这对于 matlab 来说很容易,只有 x(:,k) 但 python 的工作方式不同,我将非常感谢任何不判断我对 python 知识水平的帮助。这是怎么回事:

x = np.matrix([[1.2],[.2]]) # prior knowledge
A = np.matrix([[1, 1], [0, 1]])
B = np.matrix([[.5], [1]])
U = -9
t1 = range(1,100,1)
for k, val in enumerate(t1):
      x[:,k] = A*x[:,k-1] + B*U

据我了解,弹出错误“IndexError: index 1 is out of bounds for axis 1 with size 1”是因为 for 循环没有填充数据“x”,因此“k”都没有值-1' 或 'k'。

我应该做的是迭代和存储'x'值并每次选择相关的先前值以获得具有给定方程的新值,直到循环结束。如您所见,我有一个列矩阵,并且每次都应该有一个列矩阵。我希望我能说清楚。

谢谢

【问题讨论】:

  • 你为什么要枚举一个范围?您的操作结果将为您提供形状为 (2,1) 的数组,但您正试图将索引远远超过:最多 99。这就是您收到索引错误的原因。我不清楚你想要完成什么。也许如果你告诉我们,并告诉我们你试图用这些线来完成什么,我想我们可以帮助你了解哪里出了问题
  • 我想你想要的是x = np.concatenate((x, A.dot(x[:,k-1]) + B*U),axis=1)。当您索引到数组时,例如x[0],这是用于访问元素,而不是用于增长数组。请注意,这在numpy 中效率很低。
  • 您好,非常感谢您的回复。第一行是 x 的初始值,第二、第三、第四和第五行是 for 循环中用于计算 x 迭代的值。我实际上更改了很多次代码,我不知道为什么我使用 enumerate 但你是对的,我可以简单地使用 'for k in range(1,100,1) 代替。我会纠正的。我要实现的是一般的卡曼过滤器代码。在这个系统中,当前值 x(k) 是根据给定方程 x(k) = Ax(k-1) + BU 与先前值 x(k-1) 计算的。
  • 每个 x(k) 值在下一次迭代中变为 x(k-1),直到执行循环。在这里,我希望在每个循环之后都有 (2,k) 矩阵,因为值的记录对于其他计算是必不可少的。并且要在当前值中使用以前的值,我需要访问第 (k-1) 个值。我希望现在很清楚。再次非常感谢您。
  • 查看我的第二条评论。这应该可以解决您正在尝试做的事情。另外,将这些详细信息添加到问题中,不要将它们添加到 cmets

标签: python matlab for-loop indexing populate


【解决方案1】:

第一行是 x 的初始值,第二、第三、第四和第五行是用于 for 循环计算 x 迭代的值。

我要实现的是一般的卡曼过滤器代码。在该系统中,当前值 x(k) 使用先前值 x(k-1) 计算,给定方程 x(k) = Ax(k-1) + BU。每个 x(k) 值在下一次迭代中变为 x(k-1),直到执行循环。在这里,我希望在每个循环之后都有 (2,k) 矩阵,因为值的记录对于其他计算是必不可少的。并且要在当前值中使用以前的值,我需要访问第 (k-1) 个值。

问题已由 juanpa.arrivillaga (https://stackoverflow.com/users/5014455/juanpa-arrivillaga) 解决,谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2018-12-18
    相关资源
    最近更新 更多