Представление вектор-функции в Matlab - PullRequest
1 голос
/ 15 августа 2011

Как лучше всего перевести следующий краткий код python / numpy в matlab

from numpy import *

F = lambda x, y: (-y, x)

points = array(meshgrid([1,2,3], [4,5,6,7]))
vx, vy = F(*points)
print vx, vy

В приведенном выше коде F предназначен для представления векторного поля скорости. В частности, должна ли вектор-функция быть представлена ​​с помощью ячеек, или есть лучший способ сделать это?

Первая попытка перевести вышеуказанный код:

F = @(x,y) {-y, x};

[X, Y] = meshgrid(1:3, 4:7);
rslt = F(X, Y); 
[vx, vy] = rslt{:};

Есть ли более элегантный способ сделать это? Например, может ли анонимная функция возвращать более одного значения, чтобы можно было вызывать его следующим образом [vx, vy] = F(X,Y); вместо определения промежуточной переменной rslt?

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Кажется странным, что встроенные функции не могут возвращать более одного вывода. Возможны несколько обходных путей:

  1. Если векторы являются 2D, вы всегда можете упаковать их как комплексное число.

  2. Вы можете просто проиндексировать результат. Например. v = f(x,y) и используйте v(1) и v(2)

  3. Используйте deal следующим образом:

    f=@(x,y) deal(-y, x)
    [a,b] = f(1,2)
    

    Возвращает: a=-2 и b=1

Второй вариант, на мой взгляд, самый чистый (или вы можете просто объявить function вместо использования встроенной функции. MATLAB теперь поддерживает функции внутри функций, аналогично python).

1 голос
/ 15 августа 2011

Вы можете разделить его на две функции:

%# each is a function of two variables
Fx = @(x,y) -y;
Fy = @(x,y) x;

[X,Y] = meshgrid(1:3, 4:7);
vx = Fx(X,Y);
vy = Fy(X,Y);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...