I'm using gpuArrays with arrayfun to speed up calculations, and I would need to pass an array inside the call, as such
[Zn] = arrayfun( @iterFuncDelta,Xo,Yo,orbit)
function [Zn] = iterFuncDelta(xdelta0,ydelta0,refOrbit)
maxIterations=2^15;
delta=complex(xdelta0,ydelta0);
delta0=delta;
n=2;
Zn=refOrbit(1,1)+delta;
while ( n <= maxIterations )
Zn=refOrbit(n,1)+delta;
delta=2*refOrbit(n,1)*delta+delta^2+delta0;
n=n+1;
end
end
How could I pass the array 'orbit' so that it is not treated as a single point (like Xo and Yo) ?
Thanks.

 채택된 답변

Matt J
Matt J 2017년 12월 23일
편집: Matt J 2017년 12월 23일

0 개 추천

According to this example, it should be possible with a nested function. Not sure how fast it's likely to be, though.
function Outer(Xo,Yo,orbit) %EDIT
refOrbit=orbit;
function [Zn] = iterFuncDelta(xdelta0,ydelta0)
maxIterations=2^15;
delta=complex(xdelta0,ydelta0);
delta0=delta;
n=2;
Zn=refOrbit(1,1)+delta;
while ( n <= maxIterations )
Zn=refOrbit(n,1)+delta;
delta=2*refOrbit(n,1)*delta+delta^2+delta0;
n=n+1;
end
end
[Zn] = arrayfun( @iterFuncDelta,Xo,Yo);
end

댓글 수: 2

MR
MR 2017년 12월 23일
But in that case, how does the arrayfun() call get access to the arrays Xo and Yo?
Matt J
Matt J 2017년 12월 23일
편집: Matt J 2017년 12월 23일
You would pass that to Outer() as well (see edit). I of course can't know what other variables you actually have in your workspace, nor how they got there. The inclusion of Outer() was just an example to show the nested context needed for iterFuncDelta.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Walter Roberson
Walter Roberson 2017년 12월 23일

0 개 추천

댓글 수: 3

MR
MR 2017년 12월 23일
편집: MR 2017년 12월 23일
This seems to be the other way around than what I need: your article explains how to have extra parameters from the parent function, but I need to have parameters coming from the nested function. From the previous response:
function Outer(orbit)
refOrbit=orbit;
function [Zn] = iterFuncDelta(xdelta0,ydelta0)
[code]
end
[Zn] = arrayfun( @iterFuncDelta,Xo,Yo);
end
Calling Outer(orbit) does not work (the arrayfun() call doesn't see Xo and Yo from the workspace). What am I doing wrong?
[Zn] = arrayfun( @(x,y) iterFuncDelta(x,y,orbit), Xo, Yo )
Matt J
Matt J 2017년 12월 24일
I don't think this will work on the GPU.

댓글을 달려면 로그인하십시오.

Joss Knight
Joss Knight 2017년 12월 26일

0 개 추천

You can't do any array or matrix operations in a GPU arrayfun kernel. You can access the contents of an array that is present as an up-level variable such as has been demonstrated in the comments. You can then loop over the contents of the array one element at a time, to emulate array operations such as a dot product. This blog article gives an example of doing this for a simple 3-vector.

카테고리

도움말 센터File Exchange에서 GPU Computing에 대해 자세히 알아보기

질문:

MR
2017년 12월 23일

답변:

2017년 12월 26일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by