2012-08-10 33 views
6

Tôi sẽ chạy một bộ thử nghiệm. Phương pháp chính được đánh giá có chữ ký sau đây:MATLAB: Có phương pháp nào để tổ chức tốt hơn các chức năng cho thử nghiệm không?

[Model threshold] = detect(... 
    TrainNeg, TrainPos, nf, nT, factors, ... 
    removeEachStage, applyEstEachStage, removeFeatures); 

nơi removeEachStage, applyEstEachStage, và removeFeatures là boolean. Bạn có thể thấy rằng nếu tôi đảo ngược thứ tự của bất kỳ tham số boolean nào tôi có thể nhận được kết quả sai.

Có phương pháp nào trong MATLAB cho phép tổ chức tốt hơn để giảm thiểu loại lỗi này không? Hoặc là có bất kỳ công cụ tôi có thể sử dụng để bảo vệ tôi chống lại những lỗi này?

+2

bạn có thể tìm thấy một số các câu trả lời từ đây hữu ích: [Làm thế nào để đối phó với các cặp tên/giá trị của các đối số hàm trong MATLAB] (http://stackoverflow.com/q/2775263/97160) – Amro

+1

xem 'parseArgs' trên trao đổi tệp. Tôi sử dụng nó mỗi ngày: http://www.mathworks.com/matlabcentral/fileexchange/10670-parseargs-simplifies-input-processing-for-functions-with-multiple-options – slayton

+0

@slayton - Tôi không biết điều này . Tôi sẽ kiểm tra nó. Cảm ơn bạn! : D – Yamaneko

Trả lời

6

Tổ chức với một struct

Bạn có thể nhập một struct mà có các thông số như đó là lĩnh vực.

Ví dụ một cấu trúc với các lĩnh vực

setts.TrainNeg 
    .TrainPos 
    .nf 
    .nT 
    .factors 
    .removeEachStage 
    .applyEstEachStage 
    .removeFeatures 

Bằng cách đó khi bạn cài đặt các trường rõ ràng những gì lĩnh vực này là, không giống như một cuộc gọi chức năng mà bạn cần phải nhớ thứ tự của các tham số.

Sau đó gọi hàm của bạn trở nên

[Model threshold] = detect(setts); 

và định nghĩa chức năng của bạn sẽ là một cái gì đó giống như

function [model, threshold] = detect(setts) 

Sau đó chỉ cần thay thế các lần xuất hiện của ví dụ param với setts.param.

cách tiếp cận hỗn hợp

Bạn cũng có thể kết hợp phương pháp này với một hiện tại của bạn nếu bạn thích, ví dụ

[Model threshold] = detect(in1, in2, setts); 

nếu bạn muốn vẫn rõ ràng bao gồm in1in2, và bó phần còn lại vào setts.

phương pháp OOP

lựa chọn khác là để biến phát hiện vào một lớp. Lợi ích của việc này là một đối tượng detect sau đó sẽ có các biến thành viên với các tên cố định, trái ngược với các cấu trúc nếu bạn tạo lỗi đánh máy khi thiết lập trường, bạn chỉ cần tạo một trường mới với tên sai chính tả.

Ví dụ

classdef detect() 
properties 
    TrainNeg = []; 
    TrainPos = []; 
    nf = []; 
    nT = []; 
    factors = []; 
    removeEachStage = []; 
    applyEstEachStage = []; 
    removeFeatures =[]; 
end 
methods 
    function run(self) 
    % Put the old detect code in here, use e.g. self.TrainNeg to access member variables (aka properties) 
    end 
end 
+1

Cảm ơn câu trả lời của bạn! Nó rất rõ ràng. Tôi đã tìm thấy giải pháp thông qua OOP rất thú vị. Ngoài ra, tôi nghĩ rằng [số tiền trên không] (http: // stackoverflow.com/a/1745686/957997) được thêm vào không tạo ra nhiều khác biệt. – Yamaneko

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