为矢量输入定义多变量函数

时间:2016-08-12 03:11:48

标签: matlab vectorization

我在使用Matlab时有点新,我有一个关于为矢量输入定义多变量函数的问题。

如果函数是单个函数,比如说f(t),我知道如何将它用于向量输入。一般方法是在定义arrayfun后使用f(t)。多变量函数怎么样,比如说f(x,y)?我想要做的是获得两个输入,例如[1 2 3] x[4 5 6 7] y(维度可能不同,但它们都是列向量或行矢量)这样我就可以计算出来了

[f(1,4),f(1,5),f(1,6),f(1,7);
 f(2,4),f(2,5),f(2,6),f(2,7);
 f(3,4),f(3,5),f(3,6),f(3,7)]

难点在于xy的矢量输入可能不在同一维度。

据我所知,如果我没有f(x,y)的例子,可能很难说明。对于我f(x,y)的使用,显示f(x,y)可能会非常复杂。为简单起见,请将f(x,y)视为x^2+y,一旦定义,您就无法将其更改为x.^2+y的矢量输入。

3 个答案:

答案 0 :(得分:2)

以下是使用ndgrid的一系列建议:

testfun = @(x,y) x^2+y; % non-vectorized form
x = 1:3;
y = 4:7;
[X,Y] = ndgrid(x,y);

% if the function can be vectorized (fastest!):
testfun_vec = @(x,y) x.^2+y; % vectorized form
A = testfun_vec(X,Y);

% or without ndgrid (also super fast):
B = bsxfun(testfun_vec,x.',y); % use the transpose to take all combinations

% if not, or if it's not bivariate operation (slowest):
C = arrayfun(testfun,X(:),Y(:));
C = reshape(C,length(x),length(y));

% and if you want a loop:
D = zeros(length(x),length(y));
for k = 1:length(X(:))
    D(k) = testfun(X(k),Y(k));
end

将针对所有案例输出(ABCD):

     5     6     7     8
     8     9    10    11
    13    14    15    16

如前所述,如果你可以对你的函数进行矢量化 - 这是最好的解决方案,如果它只有两个输入bsxfun也是一个很好的解决方案。否则,如果您有小数据并希望保持代码紧凑,请使用arrayfun,如果您正在处理大型数组,请使用非嵌套 for循环。

答案 1 :(得分:0)

>> x = [1 2 3];
>> y = [4 5 6 7];
>> outValue = foo(x, y);

>> outValue

outValue =

 5     6     7     8
 8     9    10    11
13    14    15    16

制作此功能:

function out = foo(x, y)

for i = 1 : length(x)
    for j = 1 : length(y)
       out(i, j) = x(i)^2 + y(j);
    end
end

答案 2 :(得分:0)

以下是使用for循环和内联函数的代码:

x = [1 2 3];
y = [4 5 6 7];
f = @(x,y) x^2 +y;
A = zeros(length(x), length(y));
for m = 1:length(x)
    for n = 1:length(y)
        A(m, n) = f(x(m), y(n));
    end
end
disp(A);

结果:

A =

     5     6     7     8
     8     9    10    11
    13    14    15    16