我开始学习如何在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)上运行而我不能了解我的代码中的错误在哪里。
答案 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
的内容。