在Julia中,你想要根据向量函数f(x)来计算一个不精确的雅可比行列式,这需要大量的计算来评估.雅各比派的评价显然在概念上非常平行.我的问题是,这可以在Julia中完成而不需要使用DistributedArray,SharedArray等吗?
例如,假设您有代码:
function Jacob(f::Function,x)
eps=1e-7
delta=eps*eye(length(x))
J=zeros(length(x),length(x))
for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
end
J
end
Run Code Online (Sandbox Code Playgroud)
是否有可能按照与手册中的200000000随机硬币翻转总和相同的方式对此进行并行化?也就是说,等同于
nheads = @parallel (+) for i=1:200000000
int(randbool())
end
Run Code Online (Sandbox Code Playgroud)
我试过这个:
function Jacob(f::Function,x)
require("testfunc.jl");
eps=1e-7
delta=eps*eye(length(x))
J=zeros(length(x),length(x))
J=@parallel (+) for i=1:length(x)
J[:,i]=(f(x+delta[:,i])-f(x-delta[:,i]))/2/eps
J
end
J
end
Run Code Online (Sandbox Code Playgroud)
其中"testfunc.jl"是找到此代码的文件的名称,以及f本身的定义.当我尝试这个时,用f简单地评估x.^ 2 + cos(x),我能够得到一个正确的(对角线)矩阵,但是这些值与非并行代码给出的值不相符(我可以确认是正确的值).进一步调查表明,当使用julia -p 4时,得到的雅可比行列式的某些值乘以2或3.
我所描述的方法是否合理(并且只需要调整以防止重复评估)?如果没有,是否有另一种方法可以在不使用更复杂的特殊数组类型的情况下评估雅可比行列式?
似乎在并行for循环内添加"J = zeros(n,n)"作为第一个操作可以纠正这个重复问题.如果不诉诸J阵列的强力清除,可以做同样的事情吗?
请注意,这个问题是在Julia的背景下,因此(据我所知)是PCRE.
假设你有一个像这样的字符串:
"sssppaaasspaapppssss"
Run Code Online (Sandbox Code Playgroud)
并且你想单独匹配字符串末尾的重复字符(在我们的字符串的情况下,四个"s"字符 - 也就是说,matchall给出["s","s","s" ","s"],而不是["ssss"]).这很简单:
r"(.)(?=\1*$)"
Run Code Online (Sandbox Code Playgroud)
它实际上是微不足道的(并且很容易使用 - replace(r"(.)(?=\1*$)","hell","k")会给予"hekk"同时replace(r"(.)(?=\1*$)","hello","k")给予"hellk").并且可以通过将点切换为更复杂的点来重复模式:
r"(\S+)(?=( \1)*$)"
Run Code Online (Sandbox Code Playgroud)
例如,它将独立匹配"abc"的最后三个实例"abc abc defg abc h abc abc abc".
然后导致问题...如何匹配字符串开头的重复字符或模式,而不是?具体来说,以上面使用的方式使用正则表达式.
显而易见的方法是将上述正则表达式的方向反转为r"(?<=^\1*)(.)"- 但PCRE/Julia不允许lookbehinds具有可变长度(除非它是固定变量,例如(?<=ab|cde)),因此会抛出错误.下一个想法是使用"\ K"作为某些东西r"^\1*\K(.)",但这只能匹配第一个字符(可能是因为它匹配后"前进",不再匹配插入符号).
为清楚起见:我正在寻找一个正则表达式,例如,导致
replace("abc abc defg abc h abc abc abc",<regex here>,"hello")
Run Code Online (Sandbox Code Playgroud)
生产
"hello hello defg abc h abc abc abc"
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,它从一开始用"你好"替换每个"abc",但直到第一次不匹配.我在上面提供的反向链接在字符串的另一端执行此操作:
replace("abc abc defg abc h abc abc abc",r"(\S+)(?=( \1)*$)","hello")
Run Code Online (Sandbox Code Playgroud)
产生
"abc abc defg abc h hello hello hello"
Run Code Online (Sandbox Code Playgroud) 我在 Julia 中有一段代码,其中求解器在寻求一个非常复杂问题的解决方案时会迭代很多很多次。目前,我必须为代码提供多次迭代,设置得足够低,以便我不必等待代码停止几个小时才能保存当前状态,但设置得足够高,我不需要必须每 5 分钟激活一次代码。
在 Julia (0.2) 的当前状态下,有没有办法检测指示代码结束而不保存(如果出现问题)或结束保存的击键?我需要一种方法,使得代码将不受阻碍地继续,除非发生这样的击键事件,并且这将在任何迭代中中断。
本质上,我正在寻找一个命令,如果发生击键(当 Julia 运行的终端具有焦点时),它将读取击键,并在击键是特定键时运行某些代码。这可能吗?
注意:我在 Xubuntu 上通过 xfce4-terminal 运行 julia,以防影响所需的命令。