How to use arrayfun with a function having two vector arguments?
조회 수: 8 (최근 30일)
이전 댓글 표시
I have a function f(W,x), where W is a matrix and x is a vector. I would like to use arrayfun to calculate the f(W,x) for several x but constant/fix W. What is the syntax?
댓글 수: 0
채택된 답변
Andrei Bobrov
2016년 10월 18일
편집: Andrei Bobrov
2016년 10월 18일
fW = @(x) f(W, x);
out = cellfun(fW,{x1,x2,x3},'un',0);
댓글 수: 3
Adam
2016년 10월 18일
Well, did you try doing what the error suggests?! Set 'UniformOutput' to false:
out = cellfun(fW,{x1,x2,x3}, 'UniformOutput', false);
추가 답변 (2개)
Rani V.S
2016년 10월 18일
A = arrayfun(FUN, B, C, ...) evaluates FUN using elements of arrays B,
C, ... as input arguments. The (I,J,...)th element of A is equal to
FUN(B(I,J,...), C(I,J,...), ...). B, C, ... must all have the same size.
댓글 수: 0
Guillaume
2016년 10월 18일
%W = [.,.,.;.,.,.;.,.,.]; %matrix
%x = [.,.,.,.,.,.]; %vector
result = arrayfun(@(xelem) f(W, xelem), x); %possibly with 'UniformOutput', false, if f output is not scalar
Or if you want to be more explicit
%W = [.,.,.;.,.,.;.,.,.]; %matrix
%x = [.,.,.,.,.,.]; %vector
fW = @(x) f(W, x); %W must exists before this line. Changing W after this line will not affect fW
result = arrayfun(fW, x);
In either case you're creating a new function (with no name in the first case, fW in the second) that binds the matrix W to f and still takes x as an input. You're then using that function in arrayfun to apply it to each element of x.
댓글 수: 2
Guillaume
2016년 10월 18일
Well, first you shouldn't have numbered variables x1, x2, etc. Instead you should have just one variable which is a cell array of vectors. In that case, use cellfun:
x = {x1, x2, x3}; %you really shouldn't create the xi to start with. Put their content in the cell array as you create it.
result = cellfun(@(xv) f(W, xv), x, 'UniformOutput', false);
참고 항목
카테고리
Help Center 및 File Exchange에서 Operators and Elementary Operations에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!