在 Julia 中使用迭代时努力改变给定矩阵的值

Struggling with changing values of a given matrix while using the iteration in Julia

我需要在每个 forloop 之后计算 V 和 V_new 之间的差异。

我期待打印结果类似于 [1 1 ; 1 1] [2 2 ; 2 2] [2 2 ; 2 2] [3 3 ; 3 3]

然而,我得到的却是[2 2 ; 2 2] [2 2 ; 2 2] [3 3 ; 3 3] [3 3 ; 3 3]

看来问题出在 V = V_new

我试图在 for 循环开始之前首先替换 V 并仅通过 forloop 而不是 V 更改 V_new 的值。

但看起来 V 的值也通过 for 循环发生了变化。

在这种情况下,解决方案是什么?

   dif = 1.0
    it = 0
    itmax = 2
    V = [1 1 ; 1 1]
    V_new = [1 1 ; 1 1]
    # Iteration
    while it < itmax
        it = it+1
        println(it)
        V = V_new 
        for i in 1:2
            for j in 1:2
                V_new[i,j] = 1 + V_new[i,j]
            end
        end
        dif = maximum(abs.(V-V_new))
        println(V)
        println(V_new)
    end    

V = V_newV 变量重新分配给 V_new 的数组,因此它们最终引用了 相同的 数组(V 的先前数组被丢弃)。但是,您需要 VV_new 来引用 不同的 数组,因此您可以比较前后的值。

如您所知,解决方法是将 V_new 的数组值复制到 V's array. However, your for-loop has many lines of code to figure out the indices from the arrays' 维度。 VV_new形状一样,所以兼容广播:

V .= V_new

这相当于对所有索引 i 进行索引赋值 V[i] = V_new[i];这会在每个索引处改变 V,它不会重新分配 V。广播本身是一个从维度中计算出索引的循环,因此您不必编写代码来完成它。