2012-10-31 19 views
5

Khi bạn có một hàm có số lượng đối số thay đổi (như ndgrid), làm cách nào bạn có thể chuyển danh sách đối số tùy ý cho hàm đó?Làm thế nào tôi có thể vượt qua một tập hợp các số đối số không xác định cho một hàm trong MATLAB?

Ví dụ tôi muốn làm cho nó để đôi khi tôi vượt qua hai vectơ để ndgrid và nhận ra hai ma trận, tức là,

[X1,X2] = ndgrid(x1,x2); 

Nhưng lần khác tôi có thể có nhiều của X, vì vậy tôi sẽ muốn

[X1,X2,X3,X4] = ndgrid(x1,x2,x3,x4) 
  1. có bất kỳ loại cấu trúc có thể sử dụng để lưu trữ một danh sách của một số không rõ các đối số và sau đó chỉ cần cung cấp cho rằng danh sách để một chức năng? Và,
  2. Có cách nào để lấy tất cả các kết quả đầu ra từ một hàm, khi bạn không biết có bao nhiêu kết quả sẽ có?
+0

một cách nhanh chóng và dơ bẩn sẽ được trừu tượng đầu vào và đầu ra lên một trình độ của bạn ("chiều") và mất một mảng đầu vào và đầu ra một mảng - đó là [X] = ndgrid (x) trong đó X và x là mảng ô hoặc thứ gì đó, với mỗi phần tử là phần tử đầu vào thực tế –

+0

Tôi không đủ thông thạo, tuy nhiên, để xác định rõ ràng nếu MATLAB có ' varargs' loại chức năng (Tôi chắc chắn nó làm như nó có thể biên dịch thành C) –

+0

oh nó đáng kể đơn giản: http://www.mathworks.com/help/matlab/ref/varargin.html –

Trả lời

5

Sử dụng varargin, nargin, varargoutnargout bạn có thể dễ dàng xác định các chức năng lập luận/đầu ra biến. Xem liên kết tài liệu MATLAB đính kèm cho trang varargin. Những người khác được liên kết ở dưới cùng:

http://www.mathworks.com/help/matlab/ref/varargin.html

EDIT: BTW, không thổi còi còi của riêng tôi, nhưng có vẻ như được thực hiện cũng giống như tôi đã gợi ý trong "nhanh chóng-và-bẩn" comment hehehe

6

để vượt qua trong một số biến của đầu vào cho một chức năng hiện có, sử dụng mảng di động với sự mở rộng, như thế này:

x = 1:10; 
y = randn(size(x)); 
plotArguments = {'color' 'red' 'linestyle' '-'}; 
plot(x, y, plotArguments{:}); 

hoặc

plotArguments = {1:10 randn(1,10) 'color' 'red' 'linestyle' '-'}; 
plot(plotArguments{:}); 

Bạn có thể sử dụng cùng một mẹo để nhận nhiều số đầu ra. Phần cứng duy nhất là ghi nhớ các ký hiệu chính xác.

numArgumentsToAccept = 2; 
[results{1:numArgumentsToAccept }] = max(randn(100,1)); 
+0

Cảm ơn! Điều này thật đúng với gì mà tôi đã tìm kiếm. Tôi nghĩ nó có liên quan đến mảng tế bào, nhưng tôi không biết ký hiệu. – rkp

0

một hàm trả về tất cả các đối số như kết quả đầu ra:

function varargout = ndgrid(varargin)  
    varargout = varargin; 
return 
Các vấn đề liên quan