6

Nếu tôi có một mảng (độ dài không xác định cho đến khi chạy), có cách nào để gọi hàm với từng phần tử của mảng dưới dạng tham số riêng biệt không?Có một toán tử splat (hoặc tương đương) trong Matlab không?

Giống như vậy:

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

Bối cảnh: Tôi có một danh sách các chỉ số để một mảng -d n, Q. Những gì tôi muốn là một cái gì đó như Q(a,b,:), nhưng tôi chỉ có [a,b]. Vì tôi không biết n, tôi không thể chỉ lập chỉ mục mã cứng.

Trả lời

7

Không có toán tử nào trong MATLAB làm điều đó. Tuy nhiên, nếu chỉ số của bạn (ví dụ: bar trong ví dụ của bạn) được lưu trữ trong một cell array, sau đó bạn có thể làm điều này:

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

Các {:} tạo ra một comma-separated list từ một mảng tế bào. Đó có lẽ là điều gần nhất bạn có thể truy cập vào biểu mẫu "nhà điều hành" mà bạn có trong ví dụ của mình, ngoài việc ghi đè một trong số existing operators (minh họa herehere) để tạo danh sách được phân tách bằng dấu phẩy từ mảng chuẩn hoặc tạo lớp riêng để lưu trữ các chỉ mục của bạn và xác định cách các toán tử hiện tại hoạt động cho nó (không phải tùy chọn cho người yếu tim!).

Ví dụ cụ thể của bạn lập chỉ mục một mảng NĐ tùy ý, bạn cũng có thể tính toán một chỉ số tuyến tính từ chỉ số subscripted của bạn bằng cách sử dụng sub2ind function (càng chi tiết herehere), nhưng bạn có thể kết thúc làm việc nhiều hơn bạn sẽ cho giải pháp danh sách được phân cách bằng dấu phẩy ở trên. Một giải pháp thay thế khác là compute the linear index yourself, sẽ bỏ qua converting to a cell array và chỉ sử dụng các hoạt động ma trận/véc-tơ. Dưới đây là ví dụ:

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