Matlab: arrayfun, две матрицы X, Y как компоненты вектора - PullRequest
2 голосов
/ 04 июля 2019

Предположим, что X , Y - матрицы координат внутри заданных интервалов

xc = 0, yc = 0
xl = linspace(xc - 10, xc + 10, 2);
yl = linspace(yc - 10, yc + 10, 2);
[X,Y] = meshgrid(xl,yl);

, а fun это дескриптор некоторого функционального теста (v)

fun = @(v)test(v);

Как объединить обе матрицы X , Y , чтобы они представляли компоненты x, y вектора v

res = arrayfun(fun, [X,Y]); //First processed X and then Y

К сожалению, это решение не работает ....

Существует другой способ, когда функция модифицируется так, что передаются два параметра x , y

fun = @(x, y)test(x, y);
res = arrayfun(fun, X, Y); //This works well

Тем не менее, я хотел бы сохранить чередование функции, если какое-либо решение существует.

Спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 04 июля 2019
  • Переопределить fun как fun = @(x, y)test([x,y]);

Нет необходимости изменять функцию test()

xc = 0;
yc = 0;
xl = linspace(xc - 10, xc + 10, 2);
yl = linspace(yc - 10, yc + 10, 2);
[X,Y] = meshgrid(xl,yl);

% Given function test
test =@(v)v(1) + v(2);


% pass x, y as a vector  
fun = @(x, y)test([x,y]);


res = arrayfun(fun, X, Y);

% X =

   -10    10
   -10    10

% Y =

   -10   -10
    10    10

% fun(x, y) = x + y

% res =

   -20     0
     0    20

1 голос
/ 04 июля 2019

С Matlab doc :

B = arrayfun(func,A) применяет функцию func к элементам A, по одному элементу за раз

B = arrayfun(func,A1,...,An)применяется func к элементам массивов A1,...,An, так что B(i) = func(A1(i),...,An(i))

Таким образом, вы используете arrayfun неправильно.

Вместо этого используйте цикл for или два вложенных цикла.

for i=1:size(X,1)
    for j=1:size(X,2)
    res(i,j)=fun([X(i,j),Y(i,j)])
    end
end

Что вы пытаетесь сделать?

Кроме того, в Matlab вместо этого следует использовать %// для комментирования

Вот некоторые связанные вопросы:

arrayfun, когда каждая строка массива является входом

Передачавектор как несколько входов для функции

...