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))))

これで、1 回のショットで任意の数の出力が得られます。それも一行で!

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

于 2013-08-05T07:27:45.183 に答える