为什么Julia没有在函数中获取正确的数据?

时间:2018-01-08 05:40:08

标签: vector julia

我开始学习如何在Julia中编程,我正在制作一个非常简单的代码,但是它没有按照我的意愿工作,而且我迷失了,因为我无法找到错误的位置。

基本上,我有一个像这样的矢量:(1,0,0,1,1),我做了两个函数来改变矢量的条目。

第一个函数需要更改向量的每个条目1。

第二个函数需要按如下方式更改每个条目:如果条目为1,则将其更改为0,反之亦然。

我有下一个代码:

function vectorMethodOne(vector1)
    for i = 1:length(vector1)
        if vector1[i] == 0
           vector1[i] = 1
        end
    end
    return vector1
end

function vectorMethodTwo(vector1)
    for i = 1:length(vector1)
        if vector1[i] == 0
           vector1[i] = 1
        elseif vector1[i] == 1
           vector1[i] = 0
        end
    end
    return vector1
end

当我运行这样的代码时会出现问题:

vectorEx = rand(0:1, 5)
println("Original Vector:")
println(string(vectorEx))
println("Vector using method 1:")
vectorM1 = vectorMethodOne(vectorEx)
println(string(vectorM1))
println("Vector using method 2:")
vectorM2 = vectorMethodTwo(vectorEx)
println(string(vectorM2))

输出如下:

> Original Vector:
> [1,0,0,1,1]
> Vector using method 1:
> [1,1,1,1,1]
> Vector using method 2:
> [0,0,0,0,0]

但我希望输出看起来像这样:

> Original Vector:
> [1,0,0,1,1]
> Vector using method 1:
> [1,1,1,1,1]
> Vector using method 2:
> [0,1,1,0,0]

如果我只运行vectorMethodTwo,它会像我想的那样工作,如下所示:

vectorEx = rand(0:1, 5)
println("Original Vector:")
println(string(vectorEx))
println("Vector using method 2:")
vectorM2 = vectorMethodTwo(vectorEx)
println(string(vectorM2))

输出如下:

> Original Vector:
> [1,0,0,1,1]
> Vector using method 2:
> [0,1,1,0,0]

但是我希望每个函数都运行在原始向量(1,0,0,1,1)上,但是vectorMethodTwo正在修改后的向量(1,1,1,1,1)上运行而我不能了解我的代码中的错误在哪里。

1 个答案:

答案 0 :(得分:4)

让我们来看看你的输出:

> Original Vector:
> [1,0,0,1,1]
> Vector using method 1:
> [1,1,1,1,1]
> Vector using method 2:
> [0,0,0,0,0]

奇。方法2看起来像方法1翻转。我们来看看:

println(vectorMethodTwo([1,1,1,1,1]))

> [0,0,0,0,0]

非常可疑!为什么会发生这种情况?在转到下一部分之前请考虑一下。

你的“功能”是改变向量。在vectorMethodOne

中执行此操作时
vector1[i] = 1

,您要更改传入的vector1的内容。vector1指的是与vectorEx相同的内存。

不要编写改变输入的代码(除非你相应地命名函数)。在变异之前创建矢量副本,或尝试列表理解:

function vectorMethodOne(vector1)
    return [x == 0 ? 1 : x for x in vector1]
end

function vectorMethodTwo(vector1)
    return [x == 0 ? 1 : x == 1 ? 0 : x for x in vector1]
end

这些不会以任何方式修改输入vector1的内容。