2012-07-11 82 views
2

我正在處理一系列需要10個以上單值參數的MatLab函數。我用結構來傳遞參數來保持代碼可讀。一個函數頭的一個例子(輸入爲一個結構):在將結構傳遞給Matlab中的函數時重新分配變量

function output = myFunction(input) 

我發現,在整個代碼鍵入結構名稱使它更難閱讀:

calc1 = input.var1 * input.var2; 
calc2 = input.var2 * input.var3; 

我實現示例上面可以方便地使用一個數組,但是我的大部分論點都是不相關的,而且是不同類型的。另外,我在變量上執行的操作比上面的例子更復雜,並且不適用於數組。

我可以創建變量名接受來自輸入結構中的值:

function output = myFunction(input) 

var1 = input.var1; 
var2 = input.var2; 
var3 = input.var3; 

calc1 = var1 * var2; 
calc2 = var2 * var3; 

這樣做產生在這什麼都不做,但重新分配的輸入變量的函數的頂部長塊,並且數據被複制,所以存在性能損失。另一方面,代碼更易於閱讀。

是否有任何編碼規範可以提供指導?我在Google和Google上發現了大量資源,建議使用結構將大量數據傳遞給MatLab函數,但對如何智能地執行這些函數並不感興趣。

+1

我不知道您的代碼,但我不認爲輸入結構名稱會使其難以閱讀。相反,我認爲它很清楚地表明您正在計算中使用輸入變量。如果它真的困擾你,你可以選擇一個簡短的名字,比如'in',它仍然很清晰,但是產生的混亂更少。 – denahiro 2012-07-11 06:24:22

+0

我同意@denahiro - 你不應該分配'簡單'變量;只需要重新命名輸入參數即可。 – Edric 2012-07-11 07:17:24

+0

感謝您的輸入 - 我已將輸入結構名稱更改爲'in',並省略了新的變量名稱。我還將函數輸出更改爲名爲「out」的結構。我發現這樣可以更容易地發現某些錯誤。如果我在任務表達式的左側看到,我知道有什麼是錯誤的! – 2012-07-12 02:13:54

回答

1

如果你編寫一個函數來解析輸入參數,並設計它,以便它接受一個結構作爲輸入或一個變量列表,那麼該怎麼辦?

例子:

function output = myFunc(varargin) 
    narginchk(1,3); 
    [var1,var2,var3] = parseInput(varargin{:}); 

    fprintf('var 1 = %g\n', var1); 
    fprintf('var 2 = %g\n', var2); 
    fprintf('var 3 = %g\n', var3); 
    output = var1+var2+var3; 
end 

function [var1,var2,var3] = parseInput(varargin) 
    if nargin == 1 && isstruct(varargin{1}) 
     var1 = varargin{1}.var1; 
     var2 = varargin{1}.var2; 
     var3 = varargin{1}.var3; 
    elseif nargin == 3 
     [var1,var2,var3] = deal(varargin{:}); 
    else 
     error('myFunc:parseInput', 'Incorrect input') 
    end 
end 

現在,我們可以調用函數爲:

x = myFunc(1,2,3) 

或:

in = struct('var1',1, 'var2',2, 'var3',3); 
x = myFunc(in) 

當然你可以添加更多的嚴格驗證檢查輸入(見validateattributesInputParser

+0

感謝您的想法,但我需要儘可能讓這些代碼對於非專業程序員來說是可以理解的(就像我一樣)。我不認爲增加這些額外的代碼會使事情變得更清晰。我會記住未來的項目,我可以負擔得起更多的技術。 – 2012-07-12 02:18:51