私は、これが適切なケースだとは思わ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))))
これで、1 回のショットで任意の数の出力が得られます。それも一行で!
どこbsxfun
に入ったのか簡単に説明します。したがって、元の計算では、ベクトルにスカラーを乗算または追加することがあります。Matlab ではこれが許可されていますが、ベクトルを 2D 行列に追加するなどの高次元のケースは許可されていません。bsxfun
私たちのためにこれを行います。したがって、bsxfun(@times, N, B)
上記の場合B
、 3x1 ベクトルを取り、 3x2の各列で要素ごとの乗算 (@times
への関数ハンドル.*
) を実行します。ただし、ここでは、N が 3xX であっても問題ありません。つまり、任意の数の列、つまり任意の数の入力があります。B
N