- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
操作更新:请注意,在最新版本的 Julia (v0.5) 中,回答此问题的惯用方法是定义 mysquare(x::Number) = x^2
。使用自动广播覆盖矢量化案例,即 x = randn(5) ; mysquare.(x)
。另请参阅更详细地解释点语法的新答案。
我是 Julia 的新手,考虑到我的 Matlab 出身,我在确定如何编写利用多重分派(dispatch)和 Julia 类型系统的“良好”Julia 代码时遇到了一些困难。
考虑这样一种情况,我有一个函数提供 Float64
的平方。我可能会写成:
function mysquare(x::Float64)
return(x^2);
end
有时,我想对所有 Float64
进行平方s 一维数组中,但不想在 mysquare
上写出循环每次,所以我使用多重调度并添加以下内容:
function mysquare(x::Array{Float64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
但现在我有时会使用Int64
,所以我又写了两个利用多重分派(dispatch)的函数:
function mysquare(x::Int64)
return(x^2);
end
function mysquare(x::Array{Int64, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
这是对的吗?或者有更理想的方法来处理这种情况吗?我应该使用这样的类型参数吗?
function mysquare{T<:Number}(x::T)
return(x^2);
end
function mysquare{T<:Number}(x::Array{T, 1})
y = Array(Float64, length(x));
for k = 1:length(x)
y[k] = x[k]^2;
end
return(y);
end
这感觉很合理,但是我的代码运行速度会像我避免参数类型的情况一样快吗?
总而言之,我的问题分为两个部分:
如果快速代码对我很重要,我应该使用如上所述的参数类型,还是应该为不同的具体类型编写多个版本?或者我应该完全做点别的事情?
当我想要一个既可以操作数组又可以操作标量的函数时,编写该函数的两个版本(一个用于标量,一个用于数组)是否是一种好的做法?或者我应该完全做点别的事情?
最后,请指出您在上面的代码中可以想到的任何其他问题,因为我的最终目标是编写优秀的 Julia 代码。
最佳答案
Julia 根据需要为每组输入编译函数的特定版本。因此,回答第 1 部分时,性能没有差异。参数化方式是正确的选择。
对于第 2 部分,在某些情况下编写单独的版本可能是个好主意(有时是出于性能原因,例如避免复制)。但是,在您的情况下,您可以使用内置宏 @vectorize_1arg
自动生成数组版本,例如:
function mysquare{T<:Number}(x::T)
return(x^2)
end
@vectorize_1arg Number mysquare
println(mysquare([1,2,3]))
就一般样式而言,不要使用分号,而且 mysquare(x::Number) = x^2
会短很多。
对于矢量化的 mysquare
,请考虑 T
是 BigFloat
的情况。但是,您的输出数组是 Float64。处理这个问题的一种方法是将其更改为
function mysquare{T<:Number}(x::Array{T,1})
n = length(x)
y = Array(T, n)
for k = 1:n
@inbounds y[k] = x[k]^2
end
return y
end
我添加了 @inbounds
宏来提高速度,因为我们不需要每次都检查绑定(bind)违规 - 我们知道长度。如果 x[k]^2
的类型不是 T
,此函数仍然可能存在问题。更具防御性的版本可能是
function mysquare{T<:Number}(x::Array{T,1})
n = length(x)
y = Array(typeof(one(T)^2), n)
for k = 1:n
@inbounds y[k] = x[k]^2
end
return y
end
其中,如果 T
是 Int
,则 one(T)
将给出 1
,并且 1.0
如果 T
是 Float64
,依此类推。仅当您想要制作超健壮的库代码时,这些考虑因素才重要。如果您确实只处理 Float64
或可以升级为 Float64
的事物,那么这不是问题。看似辛苦,但威力却惊人。您始终可以满足于类似 Python 的性能,而忽略所有类型信息。
关于arrays - 处理多种类型和数组时如何编写 "good"Julia代码(多重分派(dispatch)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25009072/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!