【问题标题】:map function with arguments in JuliaJulia中带参数的映射函数
【发布时间】:2019-12-07 04:37:07
【问题描述】:

我在 Julia 中创建了以下函数:

using StatsBase
function samplesmallGram(A::AbstractMatrix)
    n=size(A,1)
    kpoints=sort(sample((1:n),Int(0.05*n),replace=false))
    Lsmall=A[kpoints,kpoints]
    return kpoints,Lsmall
end

我想通过map() 命令而不是for 循环将这个函数应用于我拥有的方形对称矩阵L 10 次。我试过了

map(samplesmallGram(L), 1:1:10)

但它不起作用......我怎样才能做到这一点?

【问题讨论】:

  • sample( 应该做什么,或者它来自什么包?
  • 这不是您使用map 的方式。只需查看map 的文档,它会告诉您正确的语法。
  • 对不起!我忘了提到命令sample来自的包。将纠正它...
  • @DNF 我查看了 julialang.org 的文档,但它们并不清楚,也没有得到很好的解释
  • map 的第一个输入应该是一个函数。 samplesmallGram 是函数,samplesmallGram(L) 不是函数,它是函数的输出值。

标签: function julia apply


【解决方案1】:

通常 map 用于集合的每个元素,就像每个元素的转换过程一样。

https://docs.julialang.org/en/v1/base/collections/index.html#Base.map

julia> map(x -> x * 2, [1, 2, 3])
3-element Array{Int64,1}:
 2
 4
 6

julia> map(+, [1, 2, 3], [10, 20, 30])
3-element Array{Int64,1}:
 11
 22
 33

还要看看减速器的想法。它们是相关的。

您可以将 L 作为全局变量传递,也可以在调用时使用箭头符号。

箭头符号

output = map(x -> samplesmallGram(L), 1:1:10)

请注意,在这种情况下 x 不是函数的参数,而是 L 10 次通过。

全球

A = []
function samplesmallGram(index)
   global A
   n=size(A,1)
   kpoints=sort(sample((1:n),Int(0.05*n),replace=false))
   Lsmall=A[kpoints,kpoints]
   return kpoints,Lsmall
end

output = map(samplesmallGram, 1:1:10)

希望对您有所帮助。

【讨论】:

  • 您的解释比 julialang 页面的解释更清楚 ;-)
  • 关于箭头符号,这很有趣,因为我向您的同事提到我使用 map(L -> samplesmallGram(L), 1:1:10) 没有成功,所以是的,我只需要更改 mapL 参数!
【解决方案2】:

map 假设它的第一个参数从你迭代的集合中获取元素,所以你必须这样写:

map(_ -> samplesmallGram(L), 1:1:10)

map(1:1:10) do _
    samplesmallGram(L)
end

_ 我表示我不打算使用这个论点。

但是,在这种情况下,我通常更喜欢这样写一个理解:

[samplesmallGram(L) for _ in 1:1:10]

(附注:你也可以写成1:10,而不是1:1:10

【讨论】:

  • 哦,太好了!我之前也尝试过`map(L -> samplesmallGram(L), 1:1:10)`,但效果不佳。所以,这简直太完美了!将其写为理解的特殊原因?并感谢您的旁注;-)
  • 而且,以防万一,例如,如果函数有 2 个参数?因为我想用mapslices 命令做类似的事情,我想将其应用于A 矩阵的每一行:function neig(A::AbstractMatrix,l::Int64) partialsortperm(A,1:l,rev=true) end 之后mapslices(neig,L,dims=2)
  • 然后写map(i -> neig(L, i), 1:10)(假设你还在使用同样的L矩阵)
  • 哦,很抱歉造成误解...这里,这是一个完全不同的问题。我想将neig 函数应用于L 的每一行,而不是重复10 次:-) 这就是我使用mapslices 函数的原因,但它有2 个参数:Al。我试图使用你向我解释的一个论点的情况来编码mapslices...
  • 然后将neig定义为只接受一行并写入map(neig, eachrow(L))或像neig(eachrow(L))一样广播。
猜你喜欢
  • 2022-12-17
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多