2010-03-19 31 views
5

Tôi đang viết một trình bao bọc cho một hàm lấy varargin làm đầu vào của nó. Tôi muốn giữ lại chữ ký hàm trong trình bao bọc, nhưng làm tổ varargin làm cho tất cả các biến được gộp lại với nhau.Mở rộng varargin thành các biến riêng lẻ

function inner(varargin) %#ok<VANUS> 
% An existing function 
disp(nargin) 
end 

function outer(varargin) 
% My wrapper 
inner(varargin); 
end 

outer('foo', 1:3, {}) % Uh-oh, this is 1 

Tôi cần một cách để giải nén varargin ở bên ngoài, để tôi có danh sách các biến riêng lẻ. Có một cách thực sự khó chịu để làm điều này bằng cách xây dựng một chuỗi tên của các biến để vượt qua số inner và gọi số eval.

function outer2(varargin) %#ok<VANUS> 
% My wrapper, second attempt 
inputstr = ''; 
for i = 1:nargin 
    inputstr = [inputstr 'varargin{' num2str(i) '}']; %#ok<AGROW> 
    if i < nargin 
     inputstr = [inputstr ', ']; %#ok<AGROW> 
    end 
end  
eval(['inner(' inputstr ')']); 
end 

outer2('foo', 1:3, {}) % 3, as it should be 

Bất kỳ ai cũng có thể nghĩ cách làm việc ít ghê gớm hơn không?

Trả lời

10

Các cuộc gọi trong nội tâm ở bên ngoài thay vì nên

inner(varargin{:}) 

Nói cách khác, mở rộng varargin vào danh sách bằng dấu phẩy cho các cuộc gọi đến trong. Sau đó, bạn có thể tránh tất cả các mớ hỗn độn.

+0

Cảm ơn, rất thanh lịch. –

+0

Ngoài sự tò mò, có cách tương tự để tách mảng không? Giống như một phiên bản đẹp hơn của 'c = arrayfun (@ (x) x, 1: 3, 'UniformOutput', false); c {:} '. –

+0

Không chắc chắn nó đẹp hơn, nhưng bạn có thể sử dụng các biến thể của cell2mat có lẽ. Vấn đề với arrayfun, khó hiểu là gì? Bạn cũng có thể sử dụng vòng lặp for nếu bạn preallocate đầu ra. Tôi không nghĩ rằng hiệu suất sẽ là một vấn đề lớn đối với mảng kích thước hợp lý. – Loren

Các vấn đề liên quan