2009-08-14 33 views
7

Trong MATLAB tôi có thể xác định nhiều hàm trong một tệp, chỉ với hàm được xác định đầu tiên được hiển thị bên ngoài tệp đó. Ngoài ra, tôi có thể đặt từng chức năng trong tập tin riêng của nó và làm cho tất cả chúng có thể nhìn thấy trên toàn cầu thông qua đường dẫn. Tôi đang viết một ứng dụng điều khiển menu, trong đó mỗi mục menu chạy một chức năng khác nhau. Hiện tại, đây là tất cả trong một tệp lớn, điều này ngày càng khó điều hướng. Những gì tôi muốn làm là đặt các nhóm các hàm liên quan vào các tệp riêng biệt.Làm cách nào để mô phỏng hành vi 'bao gồm' trong MATLAB?

Tôi nghĩ mình có thể làm một cái gì đó như thế này bằng cách đặt tất cả các hàm con vào một thư mục riêng và sau đó thêm thư mục vào đường dẫn trong hàm cha, nhưng điều này hơi lộn xộn và không phù hợp.

Có ai có thể đưa ra đề xuất tốt hơn không?

Lưu ý: Tôi quen thuộc nhất với MATLAB 2006, nhưng tôi đang trong quá trình nâng cấp lên MATLAB 2009.

+0

Liên quan: http://stackoverflow.com/questions/8883499/can-i-import-a-namespace-globally-without-explicitly-calling-import-in-each-and?lq=1 –

Trả lời

14

Một đề xuất, điều này sẽ tránh phải sửa đổi MATLAB path, là sử dụng private function directory. Ví dụ:

Giả sử bạn có hàm gọi là test.m trong thư mục \MATLAB\temp\ (đã có trên đường dẫn MATLAB). Nếu có các hàm cục bộ trong test.m mà bạn muốn đặt trong các tệp m của riêng chúng và bạn chỉ muốn test.m có quyền truy cập vào chúng, trước tiên bạn sẽ tạo một thư mục con trong \MATLAB\temp\ được gọi là private. Sau đó, đặt từng tệp m chức năng cục bộ từ test.m trong thư mục con private này.

Thư mục con private không cần phải được thêm vào đường dẫn MATLAB (trên thực tế, nó không nên thêm vào đường dẫn cho mọi thứ hoạt động bình thường). Chỉ có tệp test.m và các tệp m khác trong thư mục ngay phía trên thư mục con private có quyền truy cập vào các chức năng chứa trong đó. Sử dụng các hàm riêng, bạn có thể mô phỏng hiệu quả hành vi của local functions (tức là phạm vi giới hạn, quá tải hàm, v.v.) mà không phải đặt tất cả các hàm trong cùng một tệp m (có thể rất lớn đối với một số ứng dụng).

+0

Tôi không biết bạn có thể làm điều này. Tôi sẽ cho nó một cách để xem nó hoạt động như thế nào. Ít nhất tất cả các tệp chức năng sẽ được ẩn trong một góc yên tĩnh! –

+1

Dường như các tài liệu được liên kết đến đây đã bị xóa! Các thư mục chức năng riêng tư có bị coi là lỗi thời không? – Dan

+1

@Dan: Không, không lỗi thời. Chỉ là một liên kết cũ, xấu vì TMW đã cập nhật tài liệu trực tuyến của họ. Tôi đã chỉnh sửa trong các liên kết mới. – gnovice

5

Có lẽ một cái gì đó như thế này,

function foobar 
    addpath C:\Include\ModuleX 

    %% Script file residing in ModuleX 
    some_func(); 
end 

Tất nhiên, ModuleX sẽ vẫn còn trong đường dẫn tìm kiếm của bạn sau khi thoát khỏi foobar. Nếu bạn muốn đặt nó vào đường dẫn mặc định mà không cần khởi động lại, hãy thêm dòng này:

path(pathdef) 

Xem ADDPATH để biết thêm chi tiết.

+0

+1 vì điều này là một giải pháp hợp lý mà tôi đã cân nhắc. –

+0

Trong trường hợp các tệp nằm trong hệ thống phân cấp thư mục, bạn cũng có thể thêm tất cả chúng với 'addpath (genpath (PATH));'. Lưu ý rằng 'genpath'command thường rất chậm. – tashuhka

1

Bạn có thể sử dụng thư mục con bắt đầu bằng dấu "+" để tách các hàm thành không gian tên.

Ví dụ:

Đặt một chức năng "thanh" trong thư mục "+ foo"

function bar() 
print('hello world'); 

Chức năng này có thể được sử dụng như:

foo.bar() % prints hello world 

Thông tin thêm có thể được tìm thấy tại đây:

What is the closest thing MATLAB has to namespaces?

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