Vector 为什么Julia没有在函数中获取正确的数据?
我开始学习如何在Julia中编程,我正在编写一个非常简单的代码,但它没有按照我希望的那样工作,我迷路了,因为我找不到错误在哪里 基本上,我有一个像这样的向量:(1,0,0,1,1),我做了两个函数来改变向量的条目 第一个函数需要为1更改向量的每个条目 第二个函数需要如下更改每个条目:如果条目为1,则将其更改为0,反之亦然 我有下一个代码: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
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
,表示它改变了输入。