13

配列 (実行時まで長さが不明) がある場合、配列の各要素を個別のパラメーターとして関数を呼び出す方法はありますか?

そのようです:

foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)

コンテキスト: n-d 配列へのインデックスのリストがありますQ。私が欲しいのは のようなものですがQ(a,b,:)、持っているのは だけ[a,b]です。わからないのでn、インデックスをハードコーディングすることはできません。

4

1 に答える 1

15

これを行う MATLAB の演算子はありません。ただし、インデックス (つまりbar、例) がcell arrayに格納されている場合は、次のようにすることができます。

bar = {3,4,5};   %# Cell array instead of standard array
foo(bar{:});     %# Pass the contents of each cell as a separate argument

は、セル配列からコンマ区切りのリスト{:}を作成します。これはおそらく、既存の演算子の 1 つ (ここここに示されている)をオーバーライドして、標準配列からコンマ区切りのリストを生成するか、または独自のクラスにインデックスを格納し、既存の演算子がそれに対してどのように動作するかを定義します (気弱な人にはどちらのオプションもありません!)。

任意の ND 配列にインデックスを付ける特定の例については、sub2ind関数を使用して添字付きインデックスから線形インデックスを計算することもできます (詳細はこちらおよびこちら)。上記のソリューション。もう 1 つの方法は、線形インデックスを自分で計算することです。これは、セル配列への変換を回避し、行列/ベクトル演算のみを使用します。次に例を示します。

% Precompute these somewhere:
scale = cumprod(size(Q)).';  %'
scale = [1; scale(1:end-1)];
shift = [0 ones(1, ndims(Q)-1)];

% Then compute a linear index like this:
indices = [3 4 5];
linearIndex = (indices-shift)*scale;
Q(linearIndex)  % Equivalent to Q(3,4,5)
于 2012-01-11T19:47:11.050 に答える