2010-06-22 27 views
16

Giả sử tôi muốn tạo một hàm ẩn danh từ hàm m-file trả về hai kết quả đầu ra. Có thể thiết lập chức năng ẩn danh sao cho nó chỉ trả về đầu ra thứ hai từ hàm m-file?Bỏ qua kết quả đầu ra với chức năng ẩn danh trong MATLAB

Ví dụ: ttest2 trả về hai kết quả đầu ra, t/f và xác suất. Nếu tôi muốn sử dụng t-test với cellfun, tôi chỉ có thể quan tâm trong việc thu thập các xác suất, tức là tôi muốn viết một cái gì đó như thế này

probabilities = cellfun(@(u,v)ttest2(u,v)%take only second output%,cellArray1,cellArray2) 

Trả lời

14

Không có cách nào tôi biết trong biểu của các anonymous function để có nó chọn đầu ra để trở về từ một hàm với nhiều đối số đầu ra có thể. Tuy nhiên, bạn có thể trả về nhiều kết quả đầu ra khi bạn đánh giá chức năng ẩn danh. Dưới đây là một ví dụ sử dụng chức năng MAX:

>> data = [1 3 2 5 4]; %# Sample data 
>> fcn = @(x) max(x); %# An anonymous function with multiple possible outputs 
>> [maxValue,maxIndex] = fcn(data) %# Get two outputs when evaluating fcn 

maxValue = 

    5   %# The maximum value (output 1 from max) 


maxIndex = 

    4   %# The index of the maximum value (output 2 from max) 

Ngoài ra, cách tốt nhất để xử lý các ví dụ cụ thể mà bạn cung cấp cho trên là để thực sự chỉ cần sử dụng function handle@ttest2 như đầu vào CELLFUN, sau đó nhận được nhiều kết quả đầu ra từ CELLFUN bản thân :

[junk,probabilities] = cellfun(@ttest2,cellArray1,cellArray2); 

trong các phiên bản mới hơn của MATLAB, bạn có thể thay thế các biến junk với ~ bỏ qua đối số đầu ra đầu tiên.

+0

Nói cách khác, tôi cần phải viết một hàm bao bọc. Cảm ơn bạn đã làm rõ! Ngoài ra: Chúc mừng ngày 20k! – Jonas

+0

@ Jonas: Cảm ơn và chúc mừng huy hiệu MATLAB bạc! – gnovice

4

Một cách để làm điều này là để xác định các chức năng:

function varargout = getOutput(func,outputNo,varargin) 
    varargout = cell(max(outputNo),1); 
    [varargout{:}] = func(varargin{:}); 
    varargout = varargout(outputNo); 
end 

và sau đó getOutput(@ttest2,2,u,v) chỉ cung cấp cho các p-value.

Để sử dụng nó trong một cellfun bạn sẽ cần phải chạy:

probabilities = cellfun(@(u,v)getOutput(@ttest2,2,u,v)... 

này giúp loại bỏ sự cần thiết phải viết một wrapper mọi thời gian, nhưng sau đó bạn phải chắc chắn rằng chức năng này luôn luôn là trong con đường.

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