MATLABにSPLATオペレーター(または同等)はありますか?
-
27-10-2019 - |
質問
(実行時まで長さが不明な)配列がある場合、配列の各要素を個別のパラメーターとして呼び出す方法はありますか?
そのようです:
foo = @(varargin) sum(cell2mat(varargin));
bar = [3,4,5];
foo(*bar) == foo(3,4,5)
コンテキスト:インデックスのリストがあります n
-d配列、 Q
. 。私が欲しいのはそのようなものです Q(a,b,:)
, 、しかし、私は持っています [a,b]
. 。わからないので n
, 、インデックスをハードコードすることはできません。
解決
Matlabには、それを行うオペレーターはいません。ただし、インデックスの場合(すなわち bar
あなたの例では)はaに保存されました セルアレイ, 、それからあなたはこれを行うことができます:
bar = {3,4,5}; %# Cell array instead of standard array
foo(bar{:}); %# Pass the contents of each cell as a separate argument
{:}
aを作成します コンマ分離リスト セルアレイから。それはおそらく、あなたの例にある「オペレーター」フォームに到達できる最も近いものです。 既存のオペレーター (図解 ここ と ここ)標準配列からコンマ区切りリストを生成するか、独自のクラスを作成してインデックスを保存し、既存のオペレーターがどのように動作するかを定義するようにします(心の気紛れなオプションもありません!)。
任意の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)
所属していません StackOverflow