1

我有这个功能,我想对所有输入和输出使用 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;

提前致谢

4

1 回答 1

3

我不认为这是一个合适的案例,varargin甚至不适合nargin. 这是一个向量化函数的例子。

好的,假设你有这些输入: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)地方,它只需要 3x1B向量并在 3x2 的每一列上进行元素乘法(@times是函数句柄.*)。但是在这里,N 可以是 3xX,即有任意数量的列,即任意数量的输入。BN

于 2013-08-05T07:27:45.183 回答