我已经在f(x, y, z)中定义了一个函数Julia,我希望为x的许多值并行计算f,保持y和z不变。使用pmap做这件事的“最佳实践”是什么?
如果是像pmap(f, x, y = 5, z = 8)这样的东西,这是apply家族在R中处理固定参数的方式,那就太好了,但它似乎没有那么简单。我设计了解决方案,但我发现它们不优雅,我怀疑它们是否能很好地概括我的目的。
我可以将f封装在函数g中,其中g(x) = f(x, y = 5, z = 8)。然后我只打电话给pmap(g, x)。这不像我想的那么吝啬。
在定义y和z时,我可以将5和8设置为f的默认值,然后调用pmap(f, x)。这
我正在尝试编写一个函数,它将下载不同的向量并将它们组合起来,以返回一个数据帧。我在purrr包中使用pmap()遍历每个向量。我想从进度包中添加一个进度条,以向最终用户显示数据框的进度。这可以使用Read Me包中建议的<<- ... 代码的简化版本: library(tidyverse)
library(progress)
f_one_col <- function(x, m, s){
d <- tibble(i = rnorm(n = 5, mean = m, sd = s))
names(d) <- x
# slow things down
詹妮弗·布莱恩的演讲让我确信,我本学期的决心将是完全致力于tidyverse方法。然而,我的第一个编码会话已经以失败告终:
# load the necessary packages
library(tidyverse)
# create examples of my data set
prob = tibble(names = letters[1:17])
sample1 = sample(letters, 5)
# tidyverse approach, does not work
pmap(sample1, function(x) prob == x)
# basic R appr
在用addprocs创建工作人员之后,我正在尝试在他们中加载一个模块。当在顶层调用addprocs时,一切都很好。但是,当我将代码包装在函数中时,我不能做同样的事情。
在我的例子中,我动态地添加工作人员,所以总是在顶层调用@everywhere using XXX是不可行的,我需要在函数中这样做。
简而言之,这样做是可行的:
addprocs(1)
@everywhere using XXX
但这并不是:
function myaddprocs()
addprocs(1)
@everywhere using XXX
end
有什么想法吗?
我已经用dBm编写了一个简单的函数来计算测量的平均功率。首先,我必须编写函数将dBm转换为瓦特,找出平均值,然后将值转换回dBm。这对于单个向量非常有效
例如:
MeanDB <- function(dBVector) {
# Returns the variance for all the input data. First converts data to linear scale. Then mean() is applied.
# Then Data are converted back to log scale
return(10*log10(mean
在设置数组元素的值时,pmap()抛出一个BoundsError遇到了问题--我的代码适用于一个工作人员,但不超过1。我编写了一个基本工作示例,大致遵循实际的代码流:
获取源数据
定义要迭代的点集。
初始化待计算的数组点
计算每个阵列点
主要文件:
#pmapdemo.jl
using Distributed
#addprocs(length(Sys.cpu_info())) # uncomment this line for error
@everywhere include(joinpath(@__DIR__, "pmapdemo2.jl"))
f
我现在的任务是求解一个类似于eqn(a,b,c)的方程,其中a,b,c分别是数据的一列。如何将这些列传递给uniroot以同时求解根?我想也许sapply在这里是有用的。
正如alistaire建议的那样,我粘贴的细节如下:
方程式是这样的:
eqnt <- function(T,l,fn,m,EI) { T - fn^2*m/l^2 - EI }
现在,参数都是(l,fn,m,EI)加载到一个数据文件中,比如df。我打算用df中的参数来求解所有的方程。
L m EI fn
1 10 6.190004 9988.997 6.59
我的机器有四个核心。当我使用“sync”并行进行并行运行时,我注意到Julia在将作业发送到4个处理器之前将作业划分为4个:
# start of do_something.jl
function do_something(i, parts)
procs = zeros(Int, parts)
procs[i] = myid()
total = 0.0
for j = 1:i * 100000000
total = total + 1e-6
end
return procs
end
# end of do_something.jl
我希望这是一个简单的问题。我很熟悉unix/linux/etc中的fork实际上并不复制整个映像,而是使用一个写入时复制标志将共享内存映射为私有内存。为了说明这一点,我尝试了下面的示例,我预计下面的示例将显示大的malloc区域为私有(写入时复制)。然而,我得到了下面的输出。有没有人能帮我解释一下为什么会这样?我的假设是我的操作系统工作正常(uname -a: Linux xxxxxx 2.6.32-279.19.1.el6.x86_64 #1 SMP Tue Dec 18 17:22:54 CST 2012 x86_64 GNU/Linux),但是pmap没有像我预期的那样工作。
int m
我一直致力于并行化一个函数,该函数读取多项式的输入并输出它们的根。多项式是矩阵的形式,列是每个多项式。它可以很好地直接调用,但一旦我使用pmap,我就会遇到奇怪的行为。 using Distributed
@everywhere begin
using PolynomialRoots
end
addprocs(2)
@everywhere global test = ones(Int64, 10,10)
@everywhere begin
function polyRootS(n)
q=test[:,n]
r = roots(q) # p
当我将输入变量作为数据帧输入时,我已经编写了一个工作良好的函数。但是,当我想使用pmap作为数据帧列表输入输入时,我会得到以下错误:
Error in UseMethod("filter_") : no applicable method for 'filter_' applied to an object of class "character"
下面是导致错误的数据和函数的第一部分,我在函数的某些部分中使用y和一个参数,这些参数在这里没有显示:
x <- tibble::tibble(x1 = sample(0:1, 8, rep
我正在做一个Clojure项目,它接受一个数组a作为输入,并为每个i查找范围[i,j]中的最小值,在O(n)预处理中查找j,为每个查询查找O(1)中的最小值。(预处理需要O(n*log(n)),但通过使用并发(pmap)并将数组划分为n/log n数组,我们可以在O(n)中解决此问题)
因此,我选择将数组表示为向量,将矩阵表示为向量的向量。
这是C#中的函数之一:
void build_RMQ_log(int[] a)
{
ST = new int[2 * a.Length][];
for (int i = 0; i < 2 * a.Len