我有两个变量x和y,我想每循环一个x,和y做个交集,每循环一个x返回一个Vector
x=[10,20,30]
y=[50,60,70,80]
function m(i,y)
n=i:i+50
return [i,i+50,length(intersect(n,y))]
end
a=[]
for i in x
push!(a,m(i,y))
end
julia> a
3-element Vector{Any}:
[10, 60, 2]
[20, 70, 3]
[30, 80, 4]
我能想到的就是这样用for 并且push,请问下这个能用广播么?我一直对这种变量数不统一的不知道怎么高效实现,能想到的就是for和push?希望各位大佬指导
gxliu
2022 年11 月 24 日 06:59
2
看起来可能需要自己写广播规则?不太熟悉广播,提供另外一种思路抛砖引玉了。
我的思路是列表推导,代码如下:
julia> [[i, i+50, length(intersect(i:i+50, y))] for i in x]
3-element Vector{Vector{Int64}}:
[10, 60, 2]
[20, 70, 3]
[30, 80, 4]
还可以使用reduce
和 hcat
将Vector{Vector{Int64}}
转换为Matrix{Int64}
:
julia> reduce(hcat,[[i, i+50, length(intersect(i:i+50, y))] for i in x])
3×3 Matrix{Int64}:
10 20 30
60 70 80
2 3 4
如果一定要按行存储每步的结果,代码如下:
julia> reduce(vcat,[[i, i+50, length(intersect(i:i+50, y))] for i in x]')
3×3 Matrix{Int64}:
10 60 2
20 70 3
30 80 4
1 个赞
RexWzh
2022 年11 月 24 日 10:02
5
length(interset...)
不如用 count
[[i, i+50, count(i-> j ≤ i ≤ j+50, y)] for j in x]
2 个赞