分類: Octave

Octave 函數與指令稿(Functions and Scripts)

可變長度多重傳回值(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!

Page: 1 2 3 4 5 6 7 8

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang
標籤: 數學

Recent Posts

[開箱] Marttiini MFT G10 芬蘭北歐直刀

本篇是 Marttiini M...

2 年 ago

[開箱] 一般打火棒、鎂塊打火棒

本篇是鎂塊打火棒與一般普通打火...

2 年 ago

[開箱] 瑞典 BAHCO 396-Lap 魚牌軍規摺疊鋸

本篇為瑞典 BAHCO 396...

2 年 ago

[DIY] 野炊水煮蛋、紅豆湯記錄

本篇記錄今年過年期間帶阿玄在家...

2 年 ago

[竹北素食] 善菓堂 SHAN GUO TANG

本篇是我最近去竹北善菓堂用餐時...

2 年 ago

Linux 複製檔案 cp 指令用法教學與範例

本篇介紹如何在 Linux 系...

2 年 ago