首页 > 解决方案 > Julia:为什么“未定义”,当在 for 循环中调用函数来更新矩阵时

问题描述

我定义了一个函数,func(matrix_a, p, para)为了简单起见。当我在 for 循环中使用该函数时,出现错误“matrix_a not defined”。但是如果在没有 for 循环的情况下多次调用该函数,它会很好地工作。

该功能是机器人的特殊功能。根据不同p,它会返回一个新的matrix_a。当我调用它时,我按以下方式进行操作:

matrix_a = func(matrix_a, p, para)

这就像 matrix_a 被更新了。它可能与新行连接或只是在某些元素中添加了一些数字。

更具体地说,它在以下情况下返回“matrix_a not defined”

para = ones(4)
matrix_a = zeros(2, 2)
for i = 1: 4
    matrix_a = func(matrix_a, p, para[i])
end

它运行良好,当我测试它时:

para = ones(4)
matrix_a = zeros(2, 2)
i = 1
matrix_a = func(matrix_a, p, para[i])
i = 2
matrix_a = func(matrix_a, p, para[i])
i = 3
matrix_a = func(matrix_a, p, para[i])
i = 4
matrix_a = func(matrix_a, p, para[i])

标签: functionfor-loopjulia

解决方案


原因是您使用的是全局范围。IE 你在顶级全局环境中编写代码

三个解决方案是

把它写在一个函数中

function main()
    para = ones(4)
    matrix_a = zeros(2, 2)
    for i = 1: 4
        matrix_a = func(matrix_a, p, para[i])
    end
end

main()

将其写在 let 块中

let
    para = ones(4)
    matrix_a = zeros(2, 2)
    for i = 1: 4
        matrix_a = func(matrix_a, p, para[i])
    end
end

将 for 循环、while 循环视为一个函数,并将所有外部变量标记为全局变量

para = ones(4)
matrix_a = zeros(2, 2)
# treating the for loop like a function
for i = 1: 4
    global matrix_a = func(matrix_a, p, para[i])
end

这些是解决方案


推荐阅读