可變長度多重傳回值(Variable-length Return Lists)

函數的傳回值亦可指定為不固定的個數,其用法就是在傳回值的部分加入一個 varargout,此參數與輸入參數的 varargin 一樣是一個巢狀陣列(cell array,請參考巢狀陣列)。例如下面這個函數會將第一個傳回值設為 1,第二個傳回值設為 2,以此類推:

function varargout = one_to_n ()
  for i = 1:nargout
    varargout{i} = i;
  endfor
endfunction

執行此函數

[a, b, c] = one_to_n ()

輸出為

a =  1
b =  2
c =  3

varargout 參數要放在最後一個傳回值時,才有這種特別的作用,若不是放在最後一個,則會視為一般的傳回值。

[r1, r2, ..., rn] = deal (a)
[r1, r2, ..., rn] = deal (a1, a2, ..., an)

deal() 函數會將輸入的參數指定為輸出的傳回值,例如:

[a, b, c] = deal (1, 2, 3)

輸出為

a =  1
b =  2
c =  3

若只有一個輸入參數,則會將此參數指定給所有的傳回值,例如:

[a, b, c] = deal (1)

輸出為

a =  1
b =  1
c =  1

函數返回敘述(Returning From a Function)

在 Octave 函數中可以使用 return 敘述跳過之後的程式碼提早離開函數,其使用方式很簡單:

return

Octave 的 return 敘述與 C 語言中的 return 不同,其功能只有離開目前的函數而已,無法傳回任何的值,若需要傳回值必須將要傳回的值指定給傳回值參數。

下面這個範例會檢查一個向量中是否有任何一個元素不為 0

function retval = any_nonzero (v)
  retval = 0;
  for i = 1:length (v)
    if (v (i) != 0)
      retval = 1;
      return;
    endif
  endfor
  printf ("no nonzero elements found\n");
endfunction

這個函數中若要以 break 敘述來替代 return 敘述,則還要在加入一個判斷式控制最後輸出的訊息。

return

當 Octave 在函數或指令稿中碰到 return 時,會馬上返回;若在最上層執行此敘述則沒有作用。在 Octave 中每一個函數的結尾預設都會執行 return 敘述。

預設參數(Default Arguments)

由於 Octave 支援不固定的輸入參數,若配合設定參數的預設值在許多情況下會非常方便,參數預設值的使用方式為:

function name (arg1 = val1, ...)
  body
endfunction

若是這樣定義此函數,則在 arg1 沒有指定時,其預設值為 val1。例如:

function hello (who = "World")
  printf ("Hello, %s!\n", who);
endfunction

若呼叫 hello() 沒有指定參數時

hello();

who 預設為 "World",其輸出為

Hello, World!

若有指定參數

hello ("Beautiful World of Free Software");

輸出為

Hello, Beautiful World of Free Software!

若要明確告知 Octave 使用函數預設的參數,可以使用冒號,例如:

hello(:);

輸出為

Hello, World!