我希望能够使用变量从 Julia 中的可变结构中获取字段。
例如
mutable struct myType
my_field1::Int = 1
my_field2::Int = 2
my_field3::Int = 3
end
Run Code Online (Sandbox Code Playgroud)
然后让我们假设您使用以下命令声明此结构的特定实例 struct_instance = myType()
如何以可变方式从这个可变结构的实例中提取字段的值?
假设您想使用 for 循环将 my_struct.field[X] 的值分配给变量,以便您当前访问的特定字段取决于变量 X:
foo = zeros(Int64, 3)
for X = 1:3
foo(X) = struct_instance.field[X]
end
Run Code Online (Sandbox Code Playgroud)
我不知道如何实际实现上面的 for 循环——我上面写的只是上面的伪代码。在 MATLAB 中,您将使用以下符号,例如:
foo = zeros(1,3)
for x = 1:3
foo(x) = struct_instance.(sprintf('field%d',x))
end
Run Code Online (Sandbox Code Playgroud)
提前致谢。
Julia 中是否有一个函数可以为您提供数组数组(或“锯齿状数组”)中的元素总数?
这就是我的意思:
my_array_of_arrays = [ [1, 5], [6], [10, 10, 11] ]
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个desired_function(my_array_of_arrays)可以返回的函数
6
如果不是,那么在 Julia 中最快的方法是什么?
提前致谢!
我只想使用该ForwardDiff.jl功能来定义一个函数并绘制其梯度(使用 评估ForwardDiff.gradient)。它似乎不起作用,因为 的输出ForwardDiff.gradient是这种奇怪的Dual类型,并且不容易转换为所需的类型(在我的情况下,是 Float32s 的一维数组)。
using Plots
using ForwardDiff
my_func(x::Array{Float32,1}) = 1f0. / (1f0 .+ exp(3f0 .* x)) # doesn't matter what this is, just a sigmoid function here
grad_f(x::Array{Float32,1}) = ForwardDiff.gradient(my_func, x)
x_values = collect(Float32,0:0.01:10)
plot(x_values,my_func(x_values)); # this works fine
plot!(x_values,grad_f(x_values)); # this throws an error
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
ERROR: MethodError: no method matching Float64(::ForwardDiff.Dual{ForwardDiff.Tag{typeof(g),Float32},Float64,12})
Run Code Online (Sandbox Code Playgroud)
当我检查 的类型时grad_f(x_values),我得到了这个:
Array{Array{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g),Float32},Float32,12},1},1}
例如,为什么在 ForwardDiff 文档的示例中不会发生这种情况?见这里:https : //github.com/JuliaDiff/ForwardDiff.jl
提前致谢。
编辑:在 Kristoffer Carlsson 发表评论后:我试过这个,但它仍然不起作用。我不明白我在这里尝试的与他建议的有什么不同:
function g(x::Float32) …Run Code Online (Sandbox Code Playgroud) 我想在满足某个条件的矩阵的每一行中找到第一个值的索引。我想弄清楚如何在不使用数组推导式的情况下做到这一点。
这就是我将如何使用数组理解来做到这一点:
# let's say we want to find the first column index, per row, where a number in that row is below some threshold.
threshold = 0.5;
data = randn(50,100);
first_threshold_crossings = [findfirst(data[i,:]<threshold) for i in 1:size(data,1)];
Run Code Online (Sandbox Code Playgroud)
生成一个索引列表,告诉您每行的位置(按列)从左到右首先下降到阈值以下的值。
你能想象这样做的任何更快的方法吗?
broadcast multidimensional-array logical-operators julia array-broadcasting