2013-02-25 10 views
5

Nếu tôi gọi một hàm MATLAB với: func (1,2,3,4,5) nó hoạt động hoàn hảo.Muốn sử dụng một vector như tham số để một chức năng, mà không cần phải tách phần tử của nó

Nhưng nếu tôi làm: a = [1,2,3,4,5]% (a [1; 2; 3; 4; 5] cho kết quả tương tự)

sau đó :

func (một)

mang lại cho tôi:

??? Lỗi ==> func tại 11 Không đủ đối số đầu vào.

dòng 11 trong func.m là:

lỗi (nargchk (5, 6, nargin));

Tôi nhận thấy rằng đây hoạt động hoàn hảo:

func (một (1), một (2), một (3), một (4), một (5))

Làm cách nào để sử dụng vectơ 'a' làm tham số cho hàm? Tôi có một hàm khác khác (b) trả về a, và muốn sử dụng đầu ra của nó như một paramater như thế này func (otherfunc (b)).

+0

có thể trùng lặp của [Chức năng gọi với số lượng tham số khác nhau trong Matlab] (http://stackoverflow.com/questions/12741843/calling-function-with-varying-number-of-parameters-in-matlab) – user502144

Trả lời

0

Chỉ cần thực hiện hàm lấy một đối số duy nhất.

function result = func(a) 
    if ~isvector(a) 
     error('Input must be a vector') 
    end 
end 
0

Kể từ đối số cho hàm trong Matlab mình có thể vectoes (hoặc thậm chí ma trận), bạn không thể thay thế nhiều tranh cãi với một vector duy nhất.
Nếu func mong đợi 5 đối số, bạn không thể chuyển một véc tơ đơn và mong đợi MATLAB hiểu rằng tất cả năm đối số là các phần tử trong vectơ. Làm thế nào có thể Matlab cho biết sự khác biệt giữa trường hợp này và một trường hợp đối số đầu tiên là một 5-vector?

Vì vậy, tôi sẽ đề nghị giải pháp này

s.type = '()'; 
s.subs = {1:5}; 
func(subsref(num2cell(otherfunc(b)), s)) 

Tôi không chắc chắn nếu làm việc này (tôi không có matlab đây), nhưng lý do là để chuyển đổi 5 vector a (đầu ra của otherfunc(b)) vào một mảng ô và sau đó mở rộng nó dưới dạng 5 đối số khác nhau thành func.
Vui lòng không khác biệt giữa a{:}a(:) trong số subsref này.

3

Có thể bạn có thể thử với nargin - một biến trong hàm có giá trị của số đối số đầu vào. Vì bạn có nhu cầu về độ dài đầu vào khác nhau, tôi tin rằng điều này có thể được xử lý tốt nhất với varargin, có thể được đặt làm biến đầu vào cuối cùng và sau đó nhóm lại với nhau tất cả các đối số đầu vào bổ sung ..

function result = func(varargin) 
    if nargin == 5: % this is every element separately 
     x1 = varargin{1} 
     x2 = varargin{2} 
     x3 = varargin{3} 
     x4 = varargin{4} 
     x5 = varargin{5} 
    else if nargin == 1: % and one vectorized input 
     [x1 x2 x3 x4 x5] = varargin{1} 

Tôi đã viết x1...x5 cho các biến đầu vào của bạn

0

Bạn có thể tạo một hàm có dạng sau:

function [ out ] = funeval(f, x) 
    string = 'f('; 
    for I = 1:length(x) 
     string = strcat(string, 'x(' , num2str(I), '),'); 
    end 
    string(end) = ')'; 
    out = eval(string); 
end 

Trong trường hợp này, funeval(func, a) cho sản lượng yêu cầu.

0

Sử dụng eval:

astr = []; 
for i=1:length(a) 
    astr  = [astr,'a(',num2str(i),'),']; % a(1),a(2),... 
end 
astr = astr(1:end-1); 
eval(['func(' astr ');']); 
5

Comma-seperated lists (CSL) có thể được thông qua với chức năng như danh sách tham số,

vì vậy những gì bạn cần là một CSL như 1,2,3,4,5 xây dựng từ một mảng.

Nó có thể được tạo ra bằng mảng di động như thế này:

a=[1,2,3,4,5]; 
c = num2cell(a); 
func(c{:}); 
1

phương pháp khác là tạo một hàm inline riêng biệt. Giả sử bạn có một hàm f trong đó có nhiều tham số:

f = f(x1,x2,x3) 

Bạn có thể gọi đây là với một loạt các giá trị tham số bằng cách định nghĩa một chức năng riêng biệt g:

g = @(x) f(x(1),x(2),x(3)) 

Bây giờ, nếu bạn có một vector của giá trị tham số v = [1,2,3], bạn sẽ có thể gọi f (v (1), v (2), v (3)) bằng g (v).