使用varargin和varargout编写函数

时间:2013-08-05 06:38:24

标签: matlab function

我有这个功能,我想对所有输入和输出使用varargin和varargout,我不知道该怎么做。

有什么建议吗?这是我的功能:

function [Output0,Output1] = myfunction(p0,p1,normal0,normal1,c0,c1)

t0 = sqrt((c0^2)/((normal0(1)^2) + (normal0(2)^2) + (normal0(3)^2)));
Output0= p0 + normal0*t0;

t1 = sqrt((c1^2)/((normal1(1)^2) + (normal1(2)^2) + (normal1(3)^2)));
Output1= p1 + normal1*t1;

提前致谢

1 个答案:

答案 0 :(得分:3)

我不认为这是vararginnargin的合适案例。这是矢量化函数的一种情况。

好的,让我们假设你有这些输入:xo,yo,zo,x1,y1,z1(所有标量),normal0(1x3),normal1(1x3)和c0和c1都是标量。

让我们看看我们是否可以向你的函数进行矢量化以一次计算所有输出。首先,我们将重新安排您的数据:

P = [x0, x1;
     y0, y1
     z0, z1];

N = [normal0;
     normal1]'; %better here to just make normal0 a (3x1) so no need to transpose

C = [c0, c1]

现在让我们来看看你是如何获得第一个输出的:

t0 = sqrt((c0^2)/((normal0(1)^2) + (normal0(2)^2) + (normal0(3)^2)));
Output0= p0 + normal0*t0;

这可以简化为

p0 + normal0 * sqrt(c0^2/sum(normal0.^2))

可以推广到

P + bsxfun(@times,N,sqrt(bsxfun(@rdivide,C.^2,sum(N.^2))))

所以现在你可以一次性获得任意数量的输出!也是一行!

快速解释bsxfun的所在位置。因此,在您的原始计算中,您有时会将一个标量乘以或添加到矢量。 Matlab允许这样但是它不允许更高维度的情况,例如将向量添加到2D矩阵。 bsxfun为我们做了这件事。所以我上面有bsxfun(@times, N, B),它只需要3x1 B向量,并且@times的元素乘法(.*B的函数句柄)在3x2 N的每一列上。但是在这里N很好是3xX,即有任意数量的列,即任意数量的输入。