これは興味深い質問です。私は正方行列と出力同じサイズの正方行列を受け入れるバイナリ機能を有していると仮定(またはより一般的には、入力タイプとサイズは、その出力の種類とサイズと同じである'S):matlabの2入力関数を可変長入力関数に変える巧妙な方法
function C = myfunc(A,B)
する例のようになりmtimes関数。
function C = myfunc_multi(varargin)
な
myfunc(A{1},myfunc(A{2},myfunc(A{3},...myfunc(A{end-1},A{end})...))) ==
myfunc_multi(A{:})
その可変長入力機能にこれを回すのいくつかの異なったと巧妙な方法は何ですか?
これが私に来た最初の一般的なソリューションです
function C = multioutput(functionhandle, varargin)
n = length(varargin);
funcstr = functiontostring(functionhandle);
str = regexprep(arrayfun(@num2str,1:n-1),'(.)',[funcstr '(varargin{$1},']);
C = eval(sprintf('%svarargin{%d}%s',str,n,repmat(')',1,n-1)));
end
は、あなたがそれをテストするために
A = {rand(3) rand(3) rand(3) rand(3) rand(3)};
multioutput(@mtimes,A{:})-A{1}*A{2}*A{3}*A{4}*A{5}
のようなものでそれをテストすることができます(編集:再帰またはループ以外) 。あなたが考えることができる他の方法?
申し訳ありませんが、arrayfun、regexprep、evalの複雑な使い方で単純なループを避けるのはちょっと愚かです。適切なときに簡単なコードを書くことを学ぶ。ここにループがあります。この混乱は評価に時間を節約しますが、それをデバッグする必要がある場合は、まさにそのことになります。 –
さらに、私はあなたがそれを述べたので再帰の使用を勧めません。時間と記憶の無駄。 – yuk
@ woodchips、@ yuk:私が言ったように、この質問は興味深かった。他のプログラミング言語と同じように、わかりやすいやりとりや思いがけないやり方を見て楽しんでいます。私は実践よりも[IOCCC](http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest)のラインに沿ってもっと考えていました。実際にMatlabを計算に使用しているときは、「シンプルコード」と書いています。 –