(revised) What is the right way to apply parallel.pool.Constant on functional handle?

7 次查看(过去 30 天)
(original question) I use parfor-loop to process through rows of table/array. In each iteration, a function handle is called to do that. But this leads to a warning message that the function handle is 'a broadcast variabe' and might 'result in unnecessary communication overhead.' Is there a solution to avoid that?
(revised question) I tried parallel.pool.Constant(function_handle), and it generates an error message when calling the function: "Error using [my iteration function]. Unable to use a value of type string as an index." What is the right way to use parallel.pool.Constant(function_handle)?
function res = iteration(f, A)
% f is a function handle
C = cell(height(A),1);
parfor row = 1:height(A)
C{row} = f(A{row,:}); % f is a broadcast variable
end
res = vertcat(C{:});
end
  4 个评论
Walter Roberson
Walter Roberson 2023-7-27
function res = iteration(f, T)
% f is a function handle
C = cell(height(T),1);
%%%%%% adding this line would generate an error message
fh = parallel.pool.Constant(f);
parfor row = 1:height(T)
C{row} = fh.Value(T{row,:});
end
res = vertcat(C{:});
end
Note: see also rowfun
Simon
Simon 2023-7-27
@Walter Roberson Thanks for your help. Glad to learn a new thing. As for rowfun, I used it before but found it was too cumbersome in terms of input arguments. And it does not allow parfor, so I try to make a simpler parfor version for my own usage.

请先登录,再进行评论。

采纳的回答

Simon
Simon 2023-7-27
I think I found the solution: feval(). It's in the help page of broadcast variable and parfor.
function res = iter_test(f, T)
% f is a function handle
C = cell(height(T), 1);
parfor row = 1:height(T)
C{row} = feval(f, T{row, :});
end
res = vertcat(C{:});
end

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by