Filter löschen
Filter löschen

Using Arrays inside arrayfun()

4 Ansichten (letzte 30 Tage)
Maxime Rivard
Maxime Rivard am 23 Dez. 2017
Beantwortet: Joss Knight am 26 Dez. 2017
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.

Akzeptierte Antwort

Matt J
Matt J am 23 Dez. 2017
Bearbeitet: Matt J am 23 Dez. 2017
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 Kommentare
Maxime Rivard
Maxime Rivard am 23 Dez. 2017
But in that case, how does the arrayfun() call get access to the arrays Xo and Yo?
Matt J
Matt J am 23 Dez. 2017
Bearbeitet: Matt J am 23 Dez. 2017
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.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Walter Roberson
Walter Roberson am 23 Dez. 2017
  3 Kommentare
Walter Roberson
Walter Roberson am 23 Dez. 2017
[Zn] = arrayfun( @(x,y) iterFuncDelta(x,y,orbit), Xo, Yo )
Matt J
Matt J am 24 Dez. 2017
I don't think this will work on the GPU.

Melden Sie sich an, um zu kommentieren.


Joss Knight
Joss Knight am 26 Dez. 2017
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.

Kategorien

Mehr zu GPU Computing finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by