我不认为这是一个合适的案例,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,即有任意数量的列,即任意数量的输入。B
N