假设我有以下功能:
function y1(x)
y = x^(2) - 4
return y
end
现在,我想评估此序列中的所有值:collect(range(-10,10, 1000))
我试过了
y_1 = zeros(1000);
for x in collect(range(-10, 10, 1000))
y_1 = y1.(x)
end
请注意,我使用广播运算符将函数 y1
应用于采用迭代器的每个值。但如果我不使用它,我会得到相同的结果。
但作为答案,我只得到 96.0。
如何使用 for 循环重新填充 y_1
向量,以便获得评估值?
评估向量的大小应为 1000
提前致谢!
编辑:
我找到了一种无需 for 循环
即可获得所需结果的方法:
y_1 = y1.(collect(range(-10, 10, 1000)))
但我仍然想知道如何在循环中做到这一点。
最佳答案
广播运算符在整个迭代器上广播函数本身,即y1.(arr)
将
- 对数组的每个元素调用
y1
arr
- 收集所有这些调用的结果,并且
- 分配内存将这些结果也存储为数组
因此以下内容在功能方面都是等效的:
julia> arr = range(-4, 5, length = 10) #define a simple range
-4.0:1.0:5.0
julia> y1.(arr)
10-element Vector{Float64}:
12.0
5.0
0.0
-3.0
-4.0
-3.0
0.0
5.0
12.0
21.0
julia> [y1(x) for x in arr]
10-element Vector{Float64}:
(same values as above)
julia> map(y1, arr)
10-element Vector{Float64}:
(same values as above)
julia> y_1 = zeros(10);
julia> for (i, x) in pairs(arr)
y_1[i] = y1(x)
end
julia> y_1
10-element Vector{Float64}:
(same values as above)
实际上,可能还有其他考虑因素(包括性能)来决定这些选择和其他选择。
顺便说一句,请注意,很多时候您不想想要在 Julia 中收集
某个范围,即不考虑收集
在某种程度上相当于 R 中的 c()
。对于许多操作,可以直接使用范围,包括 for
循环中的 for 迭代。 collect
仅在需要实际 Vector
的极少数情况下才需要,例如。由于某种原因需要更改数组中间的值。作为一般规则,请按原样使用范围
结果,直到且除非您收到需要更改它的错误。
关于for-loop - 用 for 循环替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73757335/