# กนู อ็อกเตฟ
17 February, 1994; 30 years ago (17 February, 1994) (version 1.0)""Full-time development began in the Spring of 1992. Stable release8.4.0"GNU Octave 8.4.0 Released".  link=https://www.wikidata.org/wiki/Q223679?uselang=en#P348|text-top|frameless|10x10px|Edit this on Wikidata   / 5 November 2023Repository hg.savannah.gnu.org/hgweb/octave link=https://www.wikidata.org/wiki/Q223679#P1324|text-top|class=noprint|frameless|10x10px|Edit this at WikidataWritten inC++ (main), Octave itself (scripts), C (wrapper code), Fortran (linear algebra wrapper code)"Building - Octave". Operating systemWindows, macOS, Linux, BSDAvailable in18 languages"Basque, Belarusian, Catalan, Chinese, Dutch, English, French, German, Hungarian, Italian, Japanese, Latvian, Portuguese (Brazil), Portuguese (Portugal), Russian, Spanish, Turkish, Ukrainian". TypeScientific computingLicense2007: GPL-3.0-or-laterGPL-3.0-or-later since 2007-10-12.
1992: GPL-2.0-or-laterGPL-2.0-or-later from 1992-02-19 until 2007-10-11.Websitegnu.org/software/octave/
GNU Octave เป็น ภาษาการเขียนโปรแกรมทางวิทยาศาสตร์ สำหรับ การคำนวณทางวิทยาศาสตร์ และ การคำนวณเชิงตัวเลข อ็อกเทฟช่วยในการแก้ปัญหาเชิงเส้นและไม่เชิงเส้นในเชิงตัวเลข และสำหรับดำเนินการทดลองเชิงตัวเลขอื่นๆ โดยใช้ภาษาที่ส่วนใหญ่เข้ากันได้กับ MATLAB นอกจากนี้ยังอาจใช้เป็นภาษา ที่เน้นแบบแบตช์ ด้วย ในฐานะที่เป็นส่วนหนึ่งของ โครงการ GNU ซอฟต์แวร์นี้เป็น ซอฟต์แวร์เสรี ภายใต้เงื่อนไขของ GNU General Public License

 ประวัติ 
โครงการนี้เกิดขึ้นประมาณปี พ.ศ. 2531  ในตอนแรกตั้งใจที่จะใช้ร่วมกับหลักสูตรการออกแบบเครื่องปฏิกรณ์เคมี การพัฒนาเต็มรูปแบบเริ่มต้นโดย John W. Eaton ในปี 1992 อัลฟ่ารุ่นแรกเริ่มตั้งแต่วันที่ 4 มกราคม พ.ศ. 2536 และในวันที่ 17 กุมภาพันธ์ พ.ศ. 2537 เวอร์ชัน 1.0 ได้รับการเผยแพร่ เวอร์ชัน 8.4.0 เปิดตัวเมื่อวันที่ 5 พฤศจิกายน 2023 

โปรแกรมนี้ตั้งชื่อตาม Octave Levenspiel อดีตศาสตราจารย์ของผู้เขียนหลัก Levenspiel เป็นที่รู้จักจากความสามารถของเขาในการ คำนวณแบบ back-of-envelope อย่างรวดเร็ว 

 ประวัติการพัฒนา 
TimeAction1988/19891st discussions (Book and Software)February 1992Start of DevelopmentJanuary 1993News in Web (Version 0.60)February 19941st Publication (Version 1.0.0 to 1.1.1)December 19962nd Publication (Version 2.0.x) with Windows Port (Cygwin)March 1998Version 2.1November 2004Version 2.9 (DEV Version of 3.0)December 2007Publication of Version 3.0 (Milestone)June 2009Publication of Version 3.2 (Milestone)8 February 2011Version 3.4.0 (Milestone)22 February 2012Publication of Octave 3.6.1 (Milestone)31 December 2013Publication of Octave 3.8.0 (experimental GUI)29 May 2015Version 4.0.0 (stable GUI and new Syntax for OOP)14 November 2016Version 4.2.0 (gnuplot 4.4+)30 April 2018Version 4.4.0 (new Goal for GUI QT Toolkit, the FLTK toolkit is not deprecated and there is no schedule for its removal - while no longer prioritized)1 March 2019Publication of Octave 5.1.0 (QT5 preferred, Qt 4.8 minimum), hiDpi support31 January 2020Publication of Octave 5.2.0 (QT5 preferred)26 November 2020Publication of Octave 6.1.0 (QT5 preferred, Qt 4.x deprecated for remove in 7)20 February 2021Publication of Octave 6.2.0 (QT5 preferred), Bugfix, improved matlab syntax support6 April 2022Publication of Octave 7.1.0 (QT5 preferred), improved graphics backend and matlab compatibility28 July 2022Publication of Octave 7.2.0 (QT5 preferred), bug fixing release2 Nov 2022Publication of Octave 7.3.0 (QT5 preferred), bug fixing release7 March 2023Publication of Octave 8.1.0, improved graphics backend and matlab compatibility13 April 2023Publication of Octave 8.2.0, bug fixing release8 August 2023Publication of Octave 8.3.0, bug fixing release5 November 2023Publication of Octave 8.4.0, bug fixing release

 การพัฒนา 
นอกเหนือจากการใช้บนเดสก์ท็อปสำหรับการคำนวณทางวิทยาศาสตร์ส่วนบุคคลแล้ว Octave ยังใช้ในด้านวิชาการและอุตสาหกรรมอีกด้วย ตัวอย่างเช่น Octave ถูกใช้บนคอมพิวเตอร์คู่ขนาน ขนาดใหญ่ที่ Pittsburgh Supercomputing Center เพื่อค้นหาช่องโหว่ที่เกี่ยวข้องกับการเดาหมายเลขประกันสังคม 

การเร่งความเร็วด้วย OpenCL หรือ CUDA ก็สามารถทำได้ด้วยการใช้ GPU 

 รายละเอียดทางเทคนิค 

 อ็อกเทฟเขียนด้วย ภาษา C++ โดยใช้ ไลบรารี่มาตรฐาน C++
 อ็อกเทฟใช้ ล่าม เพื่อรันภาษาสคริปต์อ็อกเทฟ
 อ็อกเทฟสามารถขยายได้โดยใช้โมดูลที่สามารถโหลดได้แบบไดนามิก
 ตัวแปลระดับแปดเสียงมีกลไกกราฟิกที่ใช้ OpenGL เพื่อสร้างแปลง กราฟ และแผนภูมิ และบันทึกหรือพิมพ์ หรืออีกทางหนึ่ง gnuplot สามารถใช้เพื่อจุดประสงค์เดียวกันได้
 อ็อกเทฟมี ส่วนต่อประสานกราฟิกกับผู้ใช้ (GUI) นอกเหนือจาก ส่วนต่อประสานบรรทัดคำสั่ง (CLI) แบบดั้งเดิม ดู #อินเทอร์เฟซผู้ใช้ สำหรับรายละเอียด

 ภาษาอ็อกเทฟ 
ภาษาอ็อกเทฟเป็นภาษาการเขียนโปรแกรมแบบตีความ มันเป็นภาษาโปรแกรมที่มีโครงสร้าง (คล้ายกับ C) และสนับสนุนฟังก์ชันคลังมาตรฐาน C ทั่วไปจำนวนมาก และการเรียกและฟังก์ชันของระบบ UNIX บางอย่าง  อย่างไรก็ตาม มันไม่สนับสนุนการส่งผ่านอาร์กิวเมนต์โดยการอ้างอิง  แม้ว่าอาร์กิวเมนต์ของฟังก์ชันเป็น แบบคัดลอกเมื่อเขียน เพื่อหลีกเลี่ยงการทำซ้ำที่ไม่จำเป็น

โปรแกรมอ็อกเทฟประกอบด้วยรายการการเรียกใช้ฟังก์ชันหรือ สคริปต์ ไวยากรณ์เป็นแบบ เมทริกซ์ และมีฟังก์ชันต่างๆ สำหรับการดำเนินการเมทริกซ์ รองรับ โครงสร้างข้อมูล ที่หลากหลายและอนุญาต การเขียนโปรแกรมเชิงวัตถุ 

ไวยากรณ์ของมันคล้ายกับ MATLAB มากและการเขียนโปรแกรมอย่างระมัดระวังของสคริปต์จะช่วยให้สามารถทำงานได้ทั้งบน Octave และ MATLAB 

เนื่องจากอ็อกเทฟมีให้บริการภายใต้ สัญญาอนุญาตสาธารณะทั่วไปของ GNU จึงอาจมีการเปลี่ยนแปลง คัดลอก และใช้งานได้อย่างอิสระ  โปรแกรมนี้ทำงานบน Microsoft Windows และ ระบบปฏิบัติการ ที่คล้าย Unix และ Unix ส่วนใหญ่ รวมถึง Linux, Android และ macOS   

 คุณสมบัติเด่น 

 การกรอกคำสั่งและชื่อตัวแปร 
การพิมพ์อักขระ TAB บนบรรทัดคำสั่งทำให้ Octave พยายามกรอกตัวแปร ฟังก์ชัน และชื่อไฟล์ให้สมบูรณ์ (คล้ายกับ การเสร็จสิ้นแท็บ ของ Bash) อ็อกเทฟใช้ข้อความหน้าเคอร์เซอร์เป็นส่วนเริ่มต้นของชื่อเพื่อเติมให้สมบูรณ์ 

 ประวัติคำสั่ง 
เมื่อทำงานแบบโต้ตอบ Octave จะบันทึกคำสั่งที่พิมพ์ในบัฟเฟอร์ภายในเพื่อให้สามารถเรียกคืนและแก้ไขได้

 โครงสร้างข้อมูล 
อ็อกเทฟมีการรองรับจำนวนจำกัดสำหรับการจัดระเบียบข้อมูลในโครงสร้าง ในตัวอย่างนี้ เราเห็นโครงสร้าง มีองค์ประกอบ, (จำนวนเต็ม อาร์เรย์ และสตริง ตามลำดับ):octave:1> x.a = 1; x.b = [1, 2; 3, 4]; x.c = "string";
octave:2> x.a
ans =  1
octave:3> x.b
ans =

   1   2
   3   4

octave:4> x.c
ans = string
octave:5> x
x =

  scalar structure containing the fields:

    a = 1
    b =

       1   2
       3   4

    c = string

 ตัวดำเนินการบูลีนลัดวงจร 
อ็อกเทฟ && และ || ตัวดำเนินการ เชิงตรรกะได้รับการประเมินในลักษณะ ลัดวงจร (เช่น ตัวดำเนินการที่สอดคล้องกันในภาษา C) ตรงกันข้ามกับตัวดำเนินการแบบองค์ประกอบต่อองค์ประกอบ & และ | .

 ตัวดำเนินการเพิ่มและลด 

อ็อกเทฟประกอบด้วย ตัวดำเนินการการเพิ่มและลดค่า แบบ C ++ และ -- ทั้งในแบบฟอร์มคำนำหน้าและคำต่อท้าย อ็อกเทฟยังทำการ เสริมการมอบหมาย เช่น x += 5

 ผ่อนคลาย-ปกป้อง 
Octave รองรับรูปแบบ การจัดการข้อยกเว้น ที่จำกัดซึ่งจำลองตาม unwind_protect ของ Lisp รูปแบบทั่วไปของบล็อก unwind_protect มีลักษณะดังนี้:unwind_protect
  body
unwind_protect_cleanup
  cleanup
end_unwind_protectตามกฎทั่วไป GNU Octave รับรู้ว่าเป็นการยกเลิก block ที่กำหนด ไม่ว่าจะเป็นการ end คำหลัก (ซึ่งเข้ากันได้กับภาษา MATLAB) หรือ end block คำหลักที่เฉพาะเจาะจงมากขึ้น หรือในบางกรณี end_ block ด้วยเหตุนี้ บล็อก unwind_protect จึงสามารถยุติได้ด้วยคีย์เวิร์ด end_unwind_protect ดังตัวอย่าง หรือใช้คีย์เวิร์ดแบบพกพามากกว่า end

ส่วน การล้างข้อมูล ของบล็อกจะถูกดำเนินการเสมอ ในกรณีที่ส่วน ของร่างกาย เกิดข้อยกเว้น การล้างข้อมูล จะดำเนินการทันทีก่อนที่จะเผยแพร่ข้อยกเว้นไปนอกบล็อก unwind_protect

GNU Octave ยังรองรับการจัดการข้อยกเว้นรูปแบบอื่น (เข้ากันได้กับภาษา MATLAB):try
   body
catch
   exception_handling
endรูปแบบหลังนี้แตกต่างจากบล็อก unwind_protect ในสองวิธี ขั้นแรก Exception_handling จะดำเนินการเฉพาะเมื่อมีการยกข้อยกเว้นโดย body เท่านั้น ประการที่สอง หลังจากการดำเนินการของ Exception_handling ข้อยกเว้นจะไม่แพร่กระจายออกไปนอกบล็อก (เว้นแต่จะมีการแทรกคำสั่ง rethrow(lasterror) ไว้อย่างชัดเจนภายในโค้ด Exception_handling)

 รายการอาร์กิวเมนต์ที่มีความยาวผันแปรได้ 
อ็อกเทฟมีกลไกในการจัดการฟังก์ชันที่รับอาร์กิวเมนต์ที่ไม่ระบุจำนวนโดยไม่มีขีดจำกัดบนที่ชัดเจน หากต้องการระบุรายการอาร์กิวเมนต์ตั้งแต่ศูนย์ขึ้นไป ให้ใช้อาร์กิวเมนต์พิเศษ varargin เป็นอาร์กิวเมนต์สุดท้าย (หรือเท่านั้น) ในรายการ varargin เป็นอาร์เรย์เซลล์ที่มีอาร์กิวเมนต์อินพุตทั้งหมดfunction s = plus (varargin)
   if (nargin==0)
      s = 0;
   else
      s = varargin{1} + plus (varargin{2:nargin});
   end
end

 รายการส่งคืนที่มีความยาวผันแปรได้ 
สามารถตั้งค่าฟังก์ชันให้ส่งคืนค่าจำนวนเท่าใดก็ได้โดยใช้ค่าส่งคืนพิเศษ varargout ตัวอย่างเช่น:function varargout = multiassign (data)
   for k=1:nargout
      varargout{k} = data(:,k);
   end
end

 บูรณาการ C++ 
นอกจากนี้ยังสามารถรันโค้ด Octave ได้โดยตรงในโปรแกรม C++ ตัวอย่างเช่น นี่คือข้อมูลโค้ดสำหรับการเรียก rand([10,1]) :#include <octave/oct.h>
...
ColumnVector NumRands(2);
NumRands(0) = 10;
NumRands(1) = 1;
octave_value_list f_arg, f_ret;
f_arg(0) = octave_value(NumRands);
f_ret = feval("rand", f_arg, 1);
Matrix unis(f_ret(0).matrix_value);รหัส C และ C++ สามารถรวมเข้ากับ GNU Octave ได้โดยการสร้างไฟล์ oct หรือใช้ ไฟล์ MEX ที่เข้ากันได้กับ MATLAB

 ความเข้ากันได้ของ MATLAB 
Octave ได้รับการสร้างขึ้นโดยคำนึงถึงความเข้ากันได้ของ MATLAB และแบ่งปันคุณสมบัติมากมายกับ MATLAB:

 เมทริกซ์เป็นชนิดข้อมูลพื้นฐาน
 รองรับจำนวนเชิงซ้อนในตัว
 ฟังก์ชันทางคณิตศาสตร์ในตัวอันทรงพลังและไลบรารีฟังก์ชันที่กว้างขวาง
 ความสามารถในการขยายในรูปแบบของฟังก์ชันที่ผู้ใช้กำหนด

อ็อกเทฟถือว่าความไม่เข้ากันกับ MATLAB ว่าเป็น ข้อบกพร่อง ดังนั้นจึงถือได้ว่าเป็น ซอฟต์แวร์โคลน ซึ่งไม่ ละเมิดลิขสิทธิ์ซอฟต์แวร์ ตามคดีของศาล Lotus v. Borland

โดยหลักการแล้วสคริปต์ MATLAB จากที่เก็บ FileExchange ของ MathWorks นั้นเข้ากันได้กับ Octave อย่างไรก็ตาม แม้ว่าผู้ใช้มักจะจัดเตรียมและอัปโหลดภายใต้ ใบอนุญาต BSD แบบ โอเพ่นซอร์ส ที่เข้ากันได้กับ Octave และเหมาะสม แต่ ข้อกำหนดการใช้งาน FileExchange ห้ามการใช้งานใดๆ นอกเหนือจาก MATLAB ที่เป็นกรรมสิทธิ์ ของ MathWorks   

 ความเข้ากันได้ของไวยากรณ์ 
มี การเพิ่มไวยากรณ์  ที่มีจุดประสงค์เล็กน้อยแม้ว่าจะเล็กน้อยก็ตาม:

 บรรทัด ความคิดเห็น สามารถขึ้นต้นด้วยอักขระ # และ % อักขระ;
 รองรับตัวดำเนินการ ที่ใช้ C ต่างๆ ++, --, +=, *=, /=;
 องค์ประกอบสามารถอ้างอิงได้โดยไม่ต้องสร้างตัวแปรใหม่โดยการจัดทำดัชนีแบบเรียงซ้อน เช่น [1:10](3);
 สตริง สามารถกำหนดได้ด้วยอักขระ double-quote " เช่นเดียวกับอักขระ single-quote ';
 เมื่อประเภทตัวแปรเป็นแบบ เดี่ยว (ตัวเลขทศนิยมที่มีความแม่นยำเดียว) อ็อกเทฟจะคำนวณ " ค่าเฉลี่ย " ในโดเมนเดียว (MATLAB ใน โดเมนคู่) ซึ่งจะเร็วกว่าแต่ให้ผลลัพธ์ที่แม่นยำน้อยกว่า
 การบล็อกยังสามารถยุติได้ด้วยคีย์เวิร์ด โครงสร้างการควบคุม ที่เฉพาะเจาะจงมากขึ้น เช่น endif, endfor, end While เป็นต้น;
 ฟังก์ชั่นสามารถกำหนดได้ภายในสคริปต์และที่พรอมต์อ็อกเทฟ
 การมีอยู่ของลูป do-until (คล้ายกับ do- while ในภาษา C)

 ความเข้ากันได้ของฟังก์ชัน 
ฟังก์ชันต่างๆ ของ MATLAB จำนวนมาก แต่ไม่ใช่ทั้งหมดมีอยู่ใน GNU Octave และบางฟังก์ชันสามารถเข้าถึงได้ผ่านแพ็คเกจใน Octave Forge ฟังก์ชันที่มีให้ใช้งานโดยเป็นส่วนหนึ่งของแพ็คเกจ Octave หลักหรือแพ็คเกจ Forge นั้นแสดงอยู่ ในระบบออนไลน์ 

รายการฟังก์ชันที่ไม่พร้อมใช้งานจะรวมอยู่ในฟังก์ชันอ็อกเทฟ __unimplemented.m__ ฟังก์ชันที่ยังไม่ได้ดำเนินการยังแสดงอยู่ในแพ็คเกจ Octave Forge จำนวนมากใน Octave Wiki

เมื่อเรียกใช้ฟังก์ชันที่ยังไม่ได้ใช้งาน ข้อความแสดงข้อผิดพลาดต่อไปนี้จะปรากฏขึ้น:  octave:1> guide
  warning: the 'guide' function is not yet implemented in Octave

  Please read <http://www.octave.org/missing.html> to learn how you can contribute missing functionality.
  error: 'guide' undefined near line 1 column 1

 ส่วนติดต่อผู้ใช้ 
อ็อกเทฟมาพร้อมกับ ส่วนต่อประสานกราฟิกกับผู้ใช้ (GUI) อย่างเป็นทางการและ สภาพแวดล้อมการพัฒนาแบบรวม (IDE) ที่ใช้ Qt มีให้บริการตั้งแต่ Octave 3.8,  และกลายเป็นอินเทอร์เฟซเริ่มต้น (ผ่าน อินเทอร์เฟซบรรทัดคำสั่ง) ด้วยการเปิดตัว Octave 4.0  ได้รับการตอบรับอย่างดีจากผู้สนับสนุน EDN ผู้เขียน "[Octave] ตอนนี้มี GUI ที่ใช้งานได้ดีมาก" ในการตรวจสอบ GUI รุ่นใหม่ในปี 

ส่วนหน้าแบบกราฟิกของบุคคลที่สามจำนวนมากได้รับการพัฒนา เช่น ToolboX สำหรับการศึกษาการเขียนโค้ด

 แอปพลิเคชัน GUI 
ด้วยรหัส Octave ผู้ใช้สามารถสร้างแอปพลิเคชัน GUI ได้ ดู การพัฒนา GUI (GNU Octave (เวอร์ชัน 7.1.0)) ด้านล่างนี้เป็นตัวอย่างบางส่วน:

ปุ่ม, การควบคุมการแก้ไข, ช่องทำเครื่องหมาย# create figure and panel on it
f = figure;
# create a button (default style)
b1 = uicontrol (f, "string", "A Button", "position",[10 10 150 40]);
# create an edit control
e1 = uicontrol (f, "style", "edit", "string", "editable text", "position",[10 60 300 40]);
# create a checkbox
c1 = uicontrol (f, "style", "checkbox", "string", "a checkbox", "position",[10 120 150 40]);กล่องข้อความprompt = {"Width", "Height", "Depth"};
defaults = {"1.10", "2.20", "3.30"};
rowscols = [1,10; 2,20; 3,30];
dims = inputdlg (prompt, "Enter Box Dimensions", rowscols, defaults);prompt = {"Width", "Height", "Depth"};
defaults = {"1.10", "2.20", "3.30"};
rowscols = [1,10; 2,20; 3,30];
dims = inputdlg (prompt, "Enter Box Dimensions", rowscols, defaults);กล่องรายการพร้อมกล่องข้อความmy_options = {"An item", "another", "yet another"};
[sel, ok] = listdlg ("ListString", my_options, "SelectionMode", "Multiple");
if (ok == 1)
  msgbox ("You selected:");
  for i = 1:numel (sel)
    msgbox (sprintf ("\t%s", my_options{sel(i)}));
  endfor
else
  msgbox ("You cancelled.");
endifปุ่มเรดิโอ# create figure and panel on it
f = figure;
# create a button group
gp = uibuttongroup (f, "Position", [ 0 0.5 1 1])
# create a buttons in the group
b1 = uicontrol (gp, "style", "radiobutton", "string", "Choice 1", "Position", [ 10 150 100 50 ]);
b2 = uicontrol (gp, "style", "radiobutton", "string", "Choice 2", "Position", [ 10 50 100 30 ]);
# create a button not in the group
b3 = uicontrol (f, "style", "radiobutton","string", "Not in the group","Position", [ 10 50 100 50 ]);

 แพ็คเกจ 
Octave ยังมีแพ็คเกจมากมายให้เลือก แพ็คเกจเหล่านั้นตั้งอยู่ที่ Octave-Forge Octave Forge - Package หรือ Github Octave Package ใครๆ ก็สามารถสร้างและดูแลรักษาแพ็คเกจได้

 เปรียบเทียบกับซอฟต์แวร์อื่นที่คล้ายคลึงกัน 
ทางเลือก ฟรี อื่น ๆ สำหรับ MATLAB ได้แก่ Scilab และ FreeMat     Octave เข้ากันได้กับ MATLAB มากกว่า Scilab    และ FreeMat ยังไม่ได้รับการอัปเดตตั้งแต่เดือนมิถุนายน 2013 

 ดูสิ่งนี้ด้วย 

 รายการซอฟต์แวร์วิเคราะห์เชิงตัวเลข
 การเปรียบเทียบซอฟต์แวร์วิเคราะห์เชิงตัวเลข
 รายการแพ็คเกจทางสถิติ
 รายชื่อไลบรารีตัวเลข
 แมทแล็บ

 หมายเหตุ