6

Bir dizim varsa (çalışma zamanına kadar bilinmeyen uzunlukta), dizinin her öğesiyle bir işlevi ayrı bir parametre olarak çağırmanın bir yolu var mı? böylece gibiMatlab'da bir splat operatörü (veya eşdeğeri) var mı?

:

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

Bağlam: Bir n -d dizi Q için endekslerin bir listesi var. İstediğim şey Q(a,b,:) gibi bir şey, ancak sadece [a,b] var. n'u bilmediğimden, endekslemeyi kodlayamıyorum.

cevap

7

MATLAB'de bunu yapacak operatör yok. senin endeksleri (sizin örnekte yani bar) bir cell array saklandı Ancak, o zaman bu yapabilirdi:

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

{:} bir hücre diziden bir comma-separated list oluşturur. Muhtemelen, örneğinizde sahip olduğunuz "operatör" formuna en yakın şey, existing operators (resimli here ve here) 'i geçersiz kılmanın yanı sıra, standart bir diziden virgülle ayrılmış bir liste oluşturması veya oluşturulmasını sağlamaktır. endekslerinizi saklamak ve mevcut operatörlerin bunun için nasıl çalıştığını tanımlamak için kendi sınıfınız (ne kalp atışı için bir seçenek!). keyfi bir ND dizi indeksleme kullandığınız özel Örneğin

, ayrıca (detaylı here ve here gibi) sub2ind işlevini kullanarak subscripted endekslerin doğrusal bir indeks hesaplamak olabilir, ama sizin için olduğundan daha daha işi sonunda olabilir Yukarıdaki virgülle ayrılmış liste çözümüm. Başka bir alternatif, converting to a cell array'un yan tarafındaki compute the linear index yourself'dur ve sadece matris/vektör işlemlerini kullanır. İşte bir örnek:

% 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) 
İlgili konular