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?
Cảm ơn, rất thanh lịch. –
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 {:} '. –
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