存储和访问在由 Octave/Matlab 的 pararrayfun 并行化的函数内运行的矩阵
Storing and accessing matrix operated inside a function parallelized by pararrayfun of Octave/Matlab
Pararrayfun是这样使用的
pkg load parallel;
# fun is the function to apply
fun = @(x) x^2;
vector_x = 1:10000;
vector_y = pararrayfun(16, fun, vector_x);
我打算将其应用于具有这种形式的函数
fun = @(i) zz(1:100,i+1) = z.^2;
其中 z 是列向量,zz 是 100xi 矩阵。我想在 pararrayfun() 之后取出矩阵 zz,但我什么也没得到。我不知道我是否使用了正确的代码或正确的参数,因为我一个月前才开始使用 Octave。任何帮助将不胜感激。
这是我尝试的 "full" 代码:
pkg load parallel;
z = linspace(-1,10,100).';
fun = @(i) zz(1:100,i+1) = z.^2;
i = 0:9999;
pararrayfun(16, fun, i);
我尝试使用全局 zz,但我仍然一无所获。
第一个答案是你fun
里面的zz
变量是局部变量。它必须声明为 global
, but this is not possible inside an anonymous function(用 @() ...
定义)。
人们可能会试图用
来定义 fun
pkg load parallel;
z = linspace(-1,10,100).';
global zz
zz = zeros(100, 10000);
function fun1(idx, z)
global zz
zz(:, idx) = z.^2;
endfunction
fun = @(idx) fun1(idx, z)
idx = 1:10000;
pararrayfun(nproc, fun, idx);
但是zz
没有修改。可能是因为每个线程都有自己的上下文。
这是一件好事,否则在 pararrayfun
调用中修改全局变量会导致潜在的竞争条件。
这里有一个更安全的方法:
pkg load parallel;
z = linspace(-1,10,100).';
fun = @(i) z.^2;
idx = 1:10000;
zz = pararrayfun(nproc, fun, idx);
作为旁注,对于这个例子,
zz = repmat(z, 1, 10000);
会快很多。
Pararrayfun是这样使用的
pkg load parallel;
# fun is the function to apply
fun = @(x) x^2;
vector_x = 1:10000;
vector_y = pararrayfun(16, fun, vector_x);
我打算将其应用于具有这种形式的函数
fun = @(i) zz(1:100,i+1) = z.^2;
其中 z 是列向量,zz 是 100xi 矩阵。我想在 pararrayfun() 之后取出矩阵 zz,但我什么也没得到。我不知道我是否使用了正确的代码或正确的参数,因为我一个月前才开始使用 Octave。任何帮助将不胜感激。
这是我尝试的 "full" 代码:
pkg load parallel;
z = linspace(-1,10,100).';
fun = @(i) zz(1:100,i+1) = z.^2;
i = 0:9999;
pararrayfun(16, fun, i);
我尝试使用全局 zz,但我仍然一无所获。
第一个答案是你fun
里面的zz
变量是局部变量。它必须声明为 global
, but this is not possible inside an anonymous function(用 @() ...
定义)。
人们可能会试图用
来定义fun
pkg load parallel;
z = linspace(-1,10,100).';
global zz
zz = zeros(100, 10000);
function fun1(idx, z)
global zz
zz(:, idx) = z.^2;
endfunction
fun = @(idx) fun1(idx, z)
idx = 1:10000;
pararrayfun(nproc, fun, idx);
但是zz
没有修改。可能是因为每个线程都有自己的上下文。
这是一件好事,否则在 pararrayfun
调用中修改全局变量会导致潜在的竞争条件。
这里有一个更安全的方法:
pkg load parallel;
z = linspace(-1,10,100).';
fun = @(i) z.^2;
idx = 1:10000;
zz = pararrayfun(nproc, fun, idx);
作为旁注,对于这个例子,
zz = repmat(z, 1, 10000);
会快很多。