6

(런타임까지 알 수없는 길이의) 배열이있는 경우 배열의 각 요소를 개별 매개 변수로 사용하여 함수를 호출하는 방법이 있습니까? 그래서 추천Matlab에 splat 연산자 (또는 이에 상응하는 연산자)가 있습니까?

:

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

컨텍스트 : I가 n -d 배열 Q에 인덱스의리스트가있다. 내가 원하는 것은 Q(a,b,:)과 같은 것이지만, 단지 [a,b] 만 있습니다. n을 알지 못하기 때문에 인덱싱을 하드 코딩 할 수 없습니다.

답변

7

이를 수행 할 연산자가 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 

{:} 셀 배열에서 comma-separated list을 만듭니다. 이것은 예를 들어 existing operators (herehere) 중 하나를 재정의하는 것 외에도 예제 배열에서 쉼표로 구분 된 목록을 생성하거나 인덱스를 저장하고 기존 연산자가 어떻게 작동하는지 정의하는 클래스를 만듭니다 (희미한 마음도 옵션이 아닙니다!). 임의의 ND 배열 색인의 특정 예를 들어

은 또한 (자세한 herehere 같은) sub2ind 기능을 사용하여 첨자 인덱스에서 선형 지수를 계산할 수 있지만, 당신이 것보다 더 많은 일을 끝낼 수 있습니다 위의 쉼표로 구분 된 목록 솔루션. 또 다른 대안은 compute the linear index yourself이며, 이는 converting to a cell array을 회피하고 행렬/벡터 연산 만 사용합니다. 다음은 예입니다.

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