2013-08-12 47 views
8

Câu hỏi: Trong Matlab, làm thế nào tôi có thể kiểm tra xem một chức năng xử lý là một chức năng cụ thể hoặc loại chức năng?Matlab - Kiểm tra xem chức năng xử lý là một chức năng hoặc chức năng cụ thể

Ví dụ: Cho phép f1 là bộ xử lý chức năng. Làm cách nào để kiểm tra xem f1 có phải là chức năng Matlab trong xây dựng mean không? Làm cách nào để kiểm tra xem f1 có phải là một chức năng ẩn danh không?

Giải pháp hiện tại của tôi: Giải pháp hiện tại của tôi cho vấn đề này liên quan đến cuộc gọi đến chức năng functions. functions chấp nhận hàm xử lý làm đầu vào và trả về cấu trúc chứa thông tin về xử lý chức năng đầu vào, ví dụ: loại hàm, đường dẫn, tên hàm vv. Nó hoạt động, nhưng không phải là giải pháp lý tưởng vì, để báo giá official documentation:

"Thận trọng MATLAB® cung cấp chức năng functions chỉ cho mục đích truy vấn và gỡ lỗi. Bởi vì hành vi của nó có thể thay đổi trong các bản phát hành tiếp theo, bạn không nên dựa vào nó vì mục đích lập trình."

+0

Đây là một câu hỏi hợp lệ trong tóm tắt, nhưng tôi tự hỏi tại sao bạn cần phải làm điều này? Điều lớn hơn đằng sau câu hỏi mà bạn đang cố gắng làm là gì? –

+0

@SamRoberts Trong một hàm chấp nhận 'f1' là một trong các đầu vào của nó, tôi có thể thực hiện một số đoạn cắt ngắn nếu' f1' là một trong một số hàm được nhận dạng, chẳng hạn như mẫu trung bình, v.v. muốn hàm này hoạt động đối với các loại hàm khác 'f1', ở đó không thể cắt ngắn như vậy. Điều này có nghĩa không? –

+2

Colin, bạn có thể muốn đọc qua bài viết này, đặc biệt là hai bình luận (một trích dẫn, một trong các bình luận thực tế) từ MathWorks 'Loren Shure: http://undocumentedmatlab.com/blog/cellfun-undocumented-performance-boost/ Nó sẽ chỉ ra rằng một số hàm dựng sẵn như 'cellfun' đối mặt với cùng một vấn đề với bạn, và giải quyết vấn đề bằng cách cho phép cả hai hàm xử lý và một tập các đối số chuỗi có giới hạn ở cùng một nơi, cung cấp một đường dẫn mã thay thế và nhanh hơn dây. Chỉ là một ý nghĩ. –

Trả lời

11

Làm thế nào về việc sử dụng func2str?

Nếu đây là một hàm sẵn có, nó chỉ trả về một chuỗi chứa tên hàm; nếu nó là một hàm ẩn danh, nó sẽ trả về hàm ẩn danh (bao gồm @).

h1 = @(x) x.^2; 
h2 = @mean; 
str1 = func2str(h1); %str1 = "@(x) x.^2" 
str2 = func2str(h2); %str2 = "mean" 

Bạn cũng có thể sử dụng isequal để so sánh hai tay cầm function (ETA: điều này sẽ không hoạt động để so sánh hai chức năng ẩn danh trừ khi một đã được tạo ra như một bản sao của người khác):

isequal(h1,@mean); % returns 0 
isequal(h2,@mean); % returns 1 
+0

+1 Chính xác những gì tôi đang tìm kiếm. Cảm ơn nhiều. –

+5

Bạn cần phải cẩn thận với điều này - nó sẽ không hoạt động nếu đường dẫn đang thay đổi. Ví dụ: tạo một hàm do người dùng định nghĩa 'mean' trên đường dẫn. Hãy xử lý nó bằng 'f = @ mean'. Xóa hàm do người dùng định nghĩa. Thực hiện một xử lý để xây dựng trong 'mean' với' g = @ mean'. Bây giờ 'func2str (f)' và 'func2str (g)' cả hai đều trả về 'mean'. Ngoài ra (điều này có vẻ như một lỗi đối với tôi) 'isequal (f, g)' trả về 'true'. Nhưng chúng là những thứ khác nhau và 'f' bây giờ sẽ bị lỗi vì tệp không thể truy cập được. Nếu bạn cần phải lo lắng về những thay đổi đường dẫn hoặc chức năng shadowing như thế này, tôi không nghĩ rằng những gì bạn đang yêu cầu là hoàn toàn có thể. –

+1

@SamRoberts Điểm thú vị. Nó không phải là một vấn đề đối với cá nhân tôi - tôi háo hức tránh cả thay đổi đường dẫn thời gian và tên hàm trùng lặp - nhưng nhận xét của bạn chắc chắn là tài nguyên có giá trị cho những người khác quan tâm đến chủ đề này. Cảm ơn nhiều. –

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