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

Vector 为什么Julia没有在函数中获取正确的数据?,vector,julia,Vector,Julia,我开始学习如何在Julia中编程,我正在编写一个非常简单的代码,但它没有按照我希望的那样工作,我迷路了,因为我找不到错误在哪里 基本上,我有一个像这样的向量:(1,0,0,1,1),我做了两个函数来改变向量的条目 第一个函数需要为1更改向量的每个条目 第二个函数需要如下更改每个条目:如果条目为1,则将其更改为0,反之亦然 我有下一个代码: function vectorMethodOne(vector1) for i = 1:length(vector1) if vect

我开始学习如何在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]
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]
输出如下所示:

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]
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]
但我希望输出如下所示:

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]
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]
如果我只运行vectorMethodTwo,它的工作方式与我想要的一样,如下所示:

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]
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]
输出如下所示:

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]
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)上运行,我无法理解代码中的错误在哪里。

让我们看看您的输出:

> 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]
非常可疑!为什么会发生这种情况?在进入下一节之前,请仔细考虑这一点


你的“函数”正在改变向量。在
vectomethodone
中执行此操作时

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

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

非常感谢您的回答。事实上,我意识到你说的,我试着复制向量,但我认为我做得不对,因为函数仍然在变异向量。我可以向您展示我解决这个问题的尝试,这样您就可以告诉我我做错了什么?您也可以对函数开头的向量进行
copy()
,以确保没有对其进行变异,而不是(对于初学者)进行有点复杂的列表理解
fun\u vector=copy(vector1)
然后根据您的喜好修改
fun\u vector
。您还可以使用诸如
ifelse
之类的构造,它可以通过避免
if
分支来加快代码的速度。例如:
ifelse.(iszero.(v),1,v)
相当于
vectomethodone
。编辑:或者,为了避免类型不稳定:
ifelse.(iszero.(v),one(eltype(v)),v)
。只需删除此项,但如果您打算在将来使用变异函数@frl93,最好遵循它,例如
vectomethodone
而不是
vectorMethodOne
,表示它改变了输入。