【问题标题】:Can I put multiple functions into one matrix using iteration in Julia?我可以在 Julia 中使用迭代将多个函数放入一个矩阵中吗?
【发布时间】:2021-12-10 13:15:04
【问题描述】:

我是 Julia 的新手,我想看看我是否可以将不同的函数作为 Mtrix 的一个元素

我构造了一个矩阵 B (2x2)

我想把函数,例如,x^1 + 1x 作为 (1,1) 元素,x^1 + 2x 作为 (1,2) 元素, x^2 + 1x 作为 (2,1) 元素和 x^2 + 2x 作为 (2,2) 元素

我打算做如下的事情,但找不到实现它的方法。有没有可能做这样的矩阵?

B = Array{Function}(undef,2,2)
agrid = 1:1:2
dgrid = 1:1:2
for(i_a,a) in enumerate(agrid)
for(i_d,d) in enumerate(dgrid)
B[i_a,i_d](x) = x^a+d*x
end
end

我要构造这个矩阵的原因是为了求解下面的模型。

在给定“a”和“d”的情况下,我需要用两个变量“m”和“n”求解方程。

我想如果我有一个由每个函数组成的矩阵以及“a”和“d”的所有可能组合(在示例代码中,可能的组合是 (1,1) (1,2) (2 ,1) (2,2)),那么一次求解模型会更容易。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: matrix optimization julia


    【解决方案1】:

    是的,这是可能的。您可以将Functions 一个一个插入到您拥有的B 中。在这种情况下,有一个模式,因此您可以使用匿名函数和理解构建 B:

    M = 2
    N = 2
    x = 10
    
    B = [ ((y) -> (y^a + b*y)) for a in 1:M, b in 1:N]
    
    result1 = x .|> B  # result1[i] = B[i](x)
    

    不过,我宁愿不将数组的索引与函数联系起来;您将不得不继续为不同的 M 和 N 创建一个新的函数矩阵。相反,您可以创建一个内存效率更高的 CartesianIndices 矩阵并使用一个接收 CartesianIndex 的函数:

    # memory-efficient matrix of CartesianIndex{2}
    indices = CartesianIndices((M,N))
    # if x were an MxN Matrix, you could also do CartesianIndices(x)
    
    f(y, a, b) = y^a + b*y
    g(z, index::CartesianIndex{2}) = f(z, index[1], index[2])
    
    result2 = g.(x, indices) # result2[i] = g(x, indices[i])
    

    顺便说一句,在用于创建我的B 的匿名函数理解中,只编译了一个实际方法,并且每个元素类似于具有a 和b 的仿函数实例字段:

    struct P{A,B} <: Function # subtype Function to be similar to B
      a::A
      b::B
    end
    
    (p::P)(y) = y^(p.a) + (p.b)*x
    
    PB = [P(a, b) for a in 1:M, b in 1:N]
    
    result3 = x .|> PB # result3[i] = PB[i](x) = P(a, b)(x)
    

    【讨论】:

      猜你喜欢
      • 2015-07-20
      • 2021-05-23
      • 2013-05-04
      • 1970-01-01
      • 2012-06-04
      • 2021-05-23
      • 2011-11-25
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多