我在使用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)]
难点在于x
和y
的矢量输入可能不在同一维度。
据我所知,如果我没有f(x,y)
的例子,可能很难说明。对于我f(x,y)
的使用,显示f(x,y)
可能会非常复杂。为简单起见,请将f(x,y)
视为x^2+y
,一旦定义,您就无法将其更改为x.^2+y
的矢量输入。
答案 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
将针对所有案例输出(A
,B
,C
和D
):
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