2017-10-22 1 views
1

Pararrayfun이 방법흡장 옥타브 /시 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); 

I이 양식

fun = @(i) zz(1:100,i+1) = z.^2; 

Z와 기능에 적용하고자 사용되고 는 열 벡터이며, zz는 100xi 행렬입니다. pararrayfun() 후에 zz 행렬을 얻고 싶지만 아무것도 얻지 못합니다. 한 달 전에 옥타브를 사용하기 시작 했으므로 올바른 코드 또는 적절한 인수를 사용하고 있는지 잘 모릅니다. 어떤 도움이라도 정말로 감사 할 것입니다.

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를 사용하려고하지만 난 아직 아무것도 얻을 :

여기 내 시도 "전체"코드입니다.

답변

2

첫 번째 대답은 변수가 fun 인 로컬 변수입니다. global으로 선언해야하지만, anonymous function (@() ...으로 정의 됨) 내부에서는 가능하지 않습니다.

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); 

fun을 정의하려고하는 유혹 될 수 그러나 zz은 수정되지 않습니다. 각 스레드마다 자체 컨텍스트가 있기 때문일 수 있습니다.

pararrayfun 호출 내에서 전역 변수를 수정하면 잠재적 인 경쟁 조건이 발생할 수 있기 때문에 이는 좋은 방법입니다.

zz = repmat(z, 1, 10000); 

는 훨씬 빠른 것, 예를 들어, 보조 노트로

pkg load parallel; 
z = linspace(-1,10,100).'; 
fun = @(i) z.^2; 
idx = 1:10000; 
zz = pararrayfun(nproc, fun, idx); 

:

여기 안전한 방법입니다.

+0

좋은 답변이지만 OP가 (XY 문제로 인해) 도움이되지 않습니다. Btw, 병렬 패키지는 GNU/Linux에서'fork'를 사용합니다 (그리고 windoze에서는 그리 쓸모가 없습니다). 그래서 부모 프로세스가 접근 할 수 있도록 값을 전역 변수에 "저장할"수 없습니다. – Andy

+1

이것은 정확히 제가 본 것입니다 에 대한! –

+0

@Andy 정확히, 이것은 "각 스레드마다 고유 한 컨텍스트가 있음"을 의미합니다. 그래서 저는 "pararrayfun"으로 "불가능"하다고 생각했습니다. – ederag