I need help regarding parfeval implementation with object handle. I have created an object handle, the member functions of which i want to run as parallel processes.

20 次查看(过去 30 天)
I have created an object handle like this,
classdef example_class<handle
properties
A
B
end
methods
function h=example_class()
h.A=1;
h.B=1;
end
function multiply_A(h,data)
for m=1:10
h.A=h.A*data;
end
end
function add_B(h,data)
for m=1:10
h.B=h.B+data;
end
end
end
end
I want to run the methods multiply_A and add_B as parallel processes which can modify the properties of the original handle object i.e A and B. For this I am using parfeval as given in the below code,
clc;
clear all;
class1=example_class;
fout(1)=parfeval(@class1.multiply_A,0,2);
fout(2)=parfeval(@class1.add_B,0,5);
We can see that the methods dont have any output. They perform the operation on the handle objects only. But when i am running this code, the properties of the handle object 'class1' are not getting changed. A and B are initialized to 1 and they are still retaining the same value after parfeval ends. Anyone can give any idea, how to solve this so that A and B directly gets updated? It is to be noted that, the member functions should not return any value as that is the requirement of the application which i am working on.

采纳的回答

Edric Ellis
Edric Ellis 2022-12-22
The documentation here applies to parfeval as well as parfor in the sense that the object instances on the workers are not connected to the object instances back at the client. Any changes you make on the workers will not be reflected back at the client.
So, you need to do something else instead. One way is to use afterEach to update the handles. I modified your class a little bit to separate computation from update, like this:
classdef example_class<handle
properties
A
end
methods
function h=example_class()
h.A=1;
end
function newA = multiply_A(h,data)
% Returns new value, doesn't modify h
newA = h.A;
for m=1:10
newA = newA*data;
end
end
function apply_A(h, newA)
% Simply modifies h
h.A = newA;
end
end
end
Then, call it like this:
h = example_class();
% Call "multiply_A(h,2)" and grab the output
fut = parfeval(@multiply_A, 1, h, 2);
% When "fut" is complete, call "apply_A(h, newA)"
% aeFut is a future that becomes complete when the "apply_A" stage
% has happened
aeFut = afterEach(fut, @(newA) apply_A(h, newA), 0);
wait(aeFut); disp(h)

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Asynchronous Parallel Programming 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by