φυβλαςのβλογ
phyblasのブログ



ความแตกต่างในความคล้ายกันของภาษา python และ MATLAB
เขียนเมื่อ 2024/05/31 19:48
แก้ไขล่าสุด 2024/06/01 10:14
 

ทั้งไพธอนและแมตแล็บต่างก็เป็นภาษาโปรแกรมที่นิยมใช้ในการคำนวณทางวิทยาศาสตร์ รวมทั้งการเรียนรู้ของเครื่องด้วย โดยต่างก็มีความสามารถในการคำนวณด้วยแถวลำดับอย่างรวดเร็วและเขียนง่าย มีความคล้ายคลึงกันอยู่ไม่น้อย

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

ในบทความนี้จะขอสรุปเกี่ยวกับส่วนที่เหมือนจะคล้ายแต่ก็ต่าง ทำให้สับสนได้ง่าย ควรจะระวัง

เนื้อหานี้ได้เขียนเป็นภาษาญี่ปุ่นลงในเว็บ qiita ด้วย
 → 似ているようで違うMATLABとPythonの多少の擦れ違い



แถวลำดับเริ่มที่ 0 หรือว่า 1

เรื่องนี้เป็นพื้นฐานที่น่าจะรู้กันอยู่แล้วตั้งแต่เริ่มศึกษา อาจไม่จำเป็นต้องพูดก็ได้ แต่ว่าคนที่ใช้ทั้ง ๒ ภาษานี้อยู่แม้จะรู้อยู่แล้วก็มักเผลอลืมตัวใช้สลับกันได้จริงๆ พลาดได้ง่ายที่สุด ก็เลยขอยกมาเขียนเป็นลำดับแรก

เลขชี้ลำดับของค่าภายในแถวลำดับของแมตแล็บนั้นเริ่มนับไล่จาก 1
ar = [5 6 7];
ar(1) % 5

ในขณะที่ไพธอนจะเริ่มจาก 0
ar = np.array([5,6,7])
print(ar[0]) # 5
print(ar[1]) # 6

ที่จริงแล้วเริ่มจาก 1 แบบแมตแล็บดูเป็นธรรมชาติ ตรงกับความรู้สึกของคนทั่วไปมากกว่า แต่ว่าภาษาโปรแกรมส่วนใหญ่มักจะเริ่มจาก 0 ตามแบบภาษาซี เลยน่าจะเป็นความเคยชินของนักเขียนโปรแกรมส่วนใหญ่ว่าแถวลำดับต้องเริ่มนับจาก 0 ซึ่งพอชินแบบนี้ไปแล้วมาใช้แมตแล็บก็กลับจะกลายเป็นไม่ชินแล้วเผลอขึ้นมาได้

นอกจากแมตแล็บแล้วก็ยังมีภาษาฟอร์แทรน, R, จูเลีย ที่เริ่มนับจาก 1 แต่ก็ต้องถือว่าเป็นส่วนน้อยอยู่ดี




ขอบเขตเวลาเข้าถึงสมาชักที่ลำดับเรียงกัน

ทั้งแมตแล็บและไพธอนเวลาเข้าถึงสมาชิกในแถวลำดับที่เรียงกันอยู่นั้นสามารถเขียนได้ง่ายโดยใช้โคลอน : ดูเผินๆแล้วก็คล้ายกัน แต่ว่าข้อแตกต่างกันก็คือในแมตแล็บจะรวมลำดับสุดท้ายด้วย

แมตแล็บ
ar = [10 11 12 13 14];
ar(2:4) % 11 12 13

ในขณะที่ในไพธอนจะไม่รวมตัวสุดท้ายด้วย
ar = np.array([10,11,12,13,14])
print(ar[1:3]) # [11, 12]
print(ar[1:4]) # [11, 12, 13]

ดังนั้นแม้จะดูว่าเขียนคล้ายกันแต่ว่าได้ค่ามาต่างกัน ไพธอนจะหายไปตัวนึง อย่าลืมบวกเพิ่มอีก 1 ต้องระวังให้ดี




การแทนค่าเข้าไปยังลำดับที่ยังไม่มี

ในไพธอนนั้นปกติถ้าพยายามจะเข้าถึงลำดับที่เกินขอบเขตของแถวลำดับละก็จะเกิดข้อผิดพลาดขึ้น
ar =  np.array([2,2,2])
ar[6] = 3 # IndexError: index 6 is out of bounds for axis 0 with size 3

แต่ในแมตแล็บนั้นถ้าหากเป็นการแทนค่าจะไม่เกิดข้อผิดพลาดอะไรขึ้น (แต่ถ้าแค่เข้าถึงเฉยๆไม่ได้แทนค่าก็เกิดข้อผิดพลาดเหมือนกัน)
ar = [2 2 2];
ar(6) = 3 % ได้ [2 2 2 0 0 3]

ที่จริงในภาษารูบีก็เป็นแบบนั้น ถ้าแค่นี้อาจจะไม่ได้แปลกอะไรเท่าไหร่

แต่ว่าแมตแล็บนั้นที่จริงแล้วต่อให้ไม่เคยประกาศตัวแปรนั้นมาก่อนเลย อยู่ดีๆแทนค่าลงไปยังสมาชิกเลยก็ทำได้เฉยเลย
ara(4) = 5 % กลายเป็น [0 0 0 5]

หรือแม้แต่กรณีกลายมิติก็เกิดขึ้นได้
arb(3,4) = 3

ได้
     0     0     0     0
     0     0     0     0
     0     0     0     3

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




แทนค่าแล้วเป็นการคัดลอกหรือว่าแค่ใช้ข้อมูลร่วม

ในแมตแล็บนั้นถ้าแทนค่าตัวแปรที่เก็บแถวลำดับไว้ลงในอีกตัวแปรนึง ตัวแปรใหม่นั้นจะคัดลอกเอาค่าทั้งหมดในแถวลำดับนั้นไป หลังจากนั้นต่อให้ค่าภายในแถวลำดับโดยเข้าถึงผ่านตัวแปรไหนก็จะไม่กระทบกับอีกตัวแปรนึงไปด้วย
ar1 = [1 2];
ar2 = ar1;
ar1(1) = 3;
disp(ar1) % 3 2
disp(ar2) % 1 2

การที่พอแทนค่าแล้วค่าจะถูกคัดลอกไปแยกต่างหากแบบนี้ก็อาจฟังดูเป็นเรื่องธรรมดา แต่ว่าในภาษาโปรแกรมส่วนใหญ่ไม่เป็นแบบนั้น ซึ่งก็รวมถึงไพธอนด้วย พฤติกรรมโดยทั่วไปที่เจอก็คือ ตัวแปรใหม่จะใช้ข้อมูลร่วมกับตัวแปรเก่า คือค่าที่อยู่ภายในแถวลำดับนั้นจะเป็นตัวเดียวกัน ถ้าเปลี่ยนแปลงค่าผ่านตัวแปรไหน พอเข้าถึงผ่านอีกตัวแปรก็จะพบว่ามันเปลี่ยนแปลงไปด้วย
ar1 = np.array([1,2])
ar2 = ar1
ar1[0] = 3
print(ar1) # [3, 2]
print(ar2) # [3, 2]

พอเป็นแบบนี้แล้วอาจทำให้มองดูแล้วรู้สึกว่ายุ่งยาก คนที่เพิ่งหัดใหม่แล้วยังไม่ชินเผลอพลาดเพราะแบบนี้ได้บ่อยทีเดียว ต้องทำความเข้าใจและระวังให้ดี

การที่แมตแล็บไม่จำเป็นต้องมาคอยระวังตรงนี้ด้วยจึงถือว่าดีมากเลย นอกจากแมตแล็บแล้วก็มี PHP และ สวิฟต์ ด้วย แต่ว่าภาษาที่เป็นแบบนี้ถือเป็นส่วนน้อย




การคูณหารและยกกำลังแถวลำดับ

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

ปกติแล้วในไพธอนนั้นถ้าเอาแถวลำดับมาคูณกันก็จะเป็นการเอาสมาชิกภายในนั้นมาคูณกันทีละตัว
ar1 = np.array([[1,2],
                [3,4]])
ar2 = np.array([[5,6],
                [7,8]])
print(ar1*ar2)

ได้
[[ 5 12]
 [21 32]]

แบบนี้เรียกว่า ผลคูณอาดามาร์ โดยทั่วไปแล้วเข้าใจง่ายและดูจะตรงกับความรู้สึกคนทั่วไป

แต่ว่าในแมตแล็บการคูณกันของแถวลำดับนั้นจะถือว่าเป็นการคูณแบบเมทริกซ์ ก็คือเป็นผลคูณภายใน
ar1 = [1 2
       3 4];
ar2 = [5 6
       7 8];
ar1*ar2

ได้
    19    22
    43    50

จะเห็นว่าผลที่ได้นั้นต่างไปจากในไพธอน ทั้งๆที่ดูเผินๆแล้วก็ทำการคูณเหมือนกัน

ถ้าต้องการได้ผลคูณอาดามาร์เหมือนทั่วไปก็ต้องเติมจุด . เข้าไป กลายเป็น .* แทน
ar1.*ar2

ได้
     5    12
    21    32

ที่เป็นแบบนี้ก็เพราะว่าแมตแล็บจะถือว่าแถวลำดับสองมิติเป็นเมทริกซ์ ชื่อแมตแล็บเองจริงๆก็ย่อมากจาก MATrix LABoratory ดังนั้นจะเห็นว่าให้ความสำคัญกับการคำนวณเมทริกซ์

นอกจากการคูณแล้ว การหารเองก็เป็นการหารเมทริกซ์ไปด้วย ซึ่งการหารเมทริกซ์นั้นก็เท่ากับเป็นการคูณส่วนกลับของเมทริกซ์นั้นนั่นเอง
ar1/ar2

ได้
    3.0000   -2.0000
    2.0000   -1.0000

ถ้าไม่ต้องการให้เป็นแบบนั้นก็อย่าลืมเติม . ไปเป็น ./ ด้วย
ar1./ar2

ได้
    0.2000    0.3333
    0.4286    0.5000

นอกจากนั้นแล้วการยกกำลังก็เช่นกัน ถ้าเขียน A^n จะกลายเป็นการเอา A มาทำการคูณภายใน n ครั้งไป ดังนั้นถ้าต้องการแค่ให้แต่ละตัวยกกำลังแยกันไปก็ต้องเติม . ไปเป็น .^
ar = [5 5
      3 3];
ar^2
ar.^2

ได้
    40    40
    24    24

    25    25
     9     9

เรื่องความแตกต่างตรงนี้แม้จะรู้แล้วก็อาจเผลอลืมแล้วทำให้เกิดการคำนวณผิดพลาดได้ง่าย ดังนั้นจึงอาจต้องย้ำแล้วย้ำอีก




เมื่อเอาแถวลำดับหลายมิติมาเรียงในมิติเดียว

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

เช่นสำหรับแถวลำดับสองมิตินั้น ในแมตแล็บจะเริ่มจากไล่ในแนวตั้งก่อน เริ่มจากทุกตัวทางซ้ายสุดแล้วก็ไล่ไปทางขวาต่อ
ar = [1 1 1
      2 2 2];
ar(:)' % 1 2 1 2 1 2

แต่ในไพธอนจะไล่ในแนวนอนก่อน โดยเริ่มจากทุกตัวในแถวบนสุดแล้วก็ไล่ลงไป
ar = np.array([[1,1,1],
               [2,2,2]])
print(ar.ravel()) # [1 1 1 2 2 2]

ฉะนั้นต้องระวังให้ดี ไม่เช่นนั้นจะเผลอเรียงพลาดได้ผลที่ต่างจากที่คิดไว้




การเข้าถึงแถวลำดับหลายมิติโดยละการระบุบางแกน

ในไพธอนนั้นเวลาเข้าถึงสมาชิกภายในด้วยการใส่เลขตัวเดียวใน [ ] จะหมายถึงการเอาค่าทั้งหมดในแกนแรกสุด เช่นถ้าเป็นสองมิติการเขียน [i]ก็จะหมายถึงเอาแถวแนวตั้งลำดับที่ i-1 จากบน
ar = np.array([[3,6,4],
               [4,4,4],
               [5,5,7]])
print(ar[0]) # [3 6 4]
print(ar[1]) # [4 4 4]
print(ar[6]) # IndexError: index 6 is out of bounds for axis 0 with size 3

แต่ว่าในแมตแล็บนั้นถ้าใส่เลขแค่ตัวเดียวแบบนี้จะได้สมาชิกแค่ตัวเดียว โดยเป็นการดึงโดยดูลำดับของสมาชิกในทั้งแถวลำดับเหมือนการเอามาเรียงต่อกันหมดในมิติเดียว
ar = [3 6 4
      4 4 4
      5 5 7];

ar(1) % 3
ar(2) % 4
ar(6) % 5

ถ้าต้องการให้ได้ผลแบบไพธอนต้องใส่ : ไปด้วย เพื่อระบุว่าเราจะเอาทั้งหมดทุกตัวตามแกนนั้น
ar(1,:) % 3 6 4
ar(2,:) % 4 4 4

ในไพธอนเองถ้าใส่ : ก็ได้เหมือนกัน แต่ว่าถ้าจะเอาแค่แกนแรกสามารละ : ที่ตามมาได้ ไม่จำเป็นต้องใส่ ถ้าเผลอละแบบนั้นในแมตแล็บด้วยก็จะได้ผลที่แตกต่างไปเลยดังนั้นก็ต้องระวังด้วย




กลายเป็นเถวลำดับจตุรัสโดยไม่ตั้งใจ

ในแมตแล็บและไพธอนมีฟังก์ชันเช่น zeros ones randn ซึ่งสามารถสร้างแถวลำดับที่มีขนาดตามที่ระบุได้อย่างง่ายดาย

แต่ความแตกต่างจะเกิดขึ้นเมื่อต้องการสร้างแถวลำดับมิติเดียว ถ้าเป็นในไพธอนก็แค่ใส่เลขตัวเดียวไป อันนี้เข้าใจได้ง่ายๆ
print(np.ones(3)) # ได้ [1. 1. 1.]
print(np.random.randn(3)) # ได้ [ 0.07970309 -1.28657592 -1.48870568]

แต่ในแมตแล็บ ถ้าใส่เลขตัวเดียวไปแบบนี้กลับจะกลายเป็นการสร้างแถวลำดับสองมิติจตุรัสตามขนาดนั้น
disp(ones(3))
disp(randn(3))

ได้
    1     1     1
    1     1     1
    1     1     1

    0.5067   -0.7374    0.2785
    2.7564    0.7306   -1.2212
    1.0693    0.0502   -0.2428



เมื่อใช้วังวน for กับแถวลำดับ

ทั้งแมตแล็บและไพธอนนั้นต่างก็ใช้ for กับแถวลำดับเพื่อทำการวนซ้ำโดยไล่ด้วยสมาชิกในแถวลำดับนั้นเช่นกัน แต่ว่าที่ต่างกันก็คือลำดับความสำคัญของแต่ละแกน ดังนั้นผลการวนซ้ำจะต่างกัน

สำหรับในไพธอนนั้นจะเป็นการวนไล่ตามแกนแรก เช่นถ้าเป็นแถวลำดับสองมิติก็จะเป็นการไล่ตามแถวแนวตั้ง คือไล่วนจากแถวบนลงไปยังแถวล่าง จำนวนการวนซ้ำก็เท่ากับจำนวนแถวแนวตั้ง
ar = np.array([[5,6,7],
               [7,8,9]])

for a in ar:
    print(a)

ได้
[5 6 7]
[7 8 9]

แต่ว่าในแมตแล็บนั้นจะตรงกันข้าม เช่นถ้าเป็นแถวลำดับสองมิติจะไล่ตามแนวนอน โดยเอาทางซ้ายก่อนแล้วก็ไล่ไปทางขวาเรื่อยๆ
ar = [5 6 7
      7 8 9];

for a = ar
  disp(a)
end

ได้
     5
     7

     6
     8

     7
     9



เมื่อรับค่าจากฟังกชันที่มีค่าคืนกลับหลายตัว

ทั้งแมตแล็บและไพธอนสามารถสร้างฟังก์ชันให้ส่งค่าคืนกลับพร้อมกันหลายตัวได้ เช่นในแมตแล็บเขียนแบบนี้
function [a,b,c] = fcn()
    a = 1;
    b = 2;
    c = 3;
end

[x,y,z] = fc

ได้
x =
     1

y =
     2

z =
     3


เพียงแต่ถ้าหากตัวแปรที่เอามารับมีจำนวนไม่ครบก็จะจะรับแค่เท่าที่มี ส่วนที่เหลือก็จะถูกทิ้งไป
[x,y] = fc

ได้
x =
     1

y =
     2

นอกจากนี้ ถ้าไม่เอาตัวแปรมารับ แค่ปล่อยให้นำมาแสดงผลก็จะแสดงแค่ค่าแรกเท่านั้น ส่วนที่เหลือไม่ได้ถูกแสดงด้วย
fc

ได้
x =
     1

สำหรับในไพธอนนั้น ถ้าจำนวนตัวแปรที่มารับค่าไม่เท่ากับที่ฟังก์ชันคืนมาก็จะเกิดข้อผิดพลาด
def fcn():
    return 1,2,3

x,y = fcn() # ValueError: too many values to unpack (expected 2)

เพียงแต่ว่าถ้าใช้ตัวแปรเดียวรับจะไม่เกิดข้อผิดพลาด แต่จะได้ค่าคืนกลับทั้งหมดเข้ามาอยู่ในรูปของทูเพิล
x = fcn()
print(x) # (1, 2, 3)

ดังนั้นจะแค่เอาตัวแปรเดียวมารับแล้วค่อยไปจัดการแบ่งทีหลังก็ได้ แบบนี้ก็สะดวกดีเหมือนกัน

แต่ว่าแมตแล็บจำเป็นต้องเอาตัวแปรมารับตามจำนวนที่ต้องการเสมอ ไม่งั้นจะถูกทิ้งไป ถึงต้องการเอามาใช้ตอนหลังก็เอากลับคืนมาไม่ได้ ดังนั้นก็ต้องระวังตรงนี้ด้วย



สายอักขระที่สร้างจาก " " และ ' '

ไพธอนนั้นสายอักขระจะสร้างโดยใช้ " " หรือ ' ' ก็ได้เหมือนกัน ยังไงก็เป็นข้อมูลชนิดเดียวกัน สายอักขระ str เหมือนกัน แต่ว่าในแมตแล็บนั้นการสร้างด้วย " " กับ ' ' นั้นจะได้สิ่งที่ต่างกันไป สายอักขระที่สร้างด้วย " " จะเป็นชนิด string แต่ถ้าสร้างด้วย ' ' จะเป็นแถวลำดับชนิด char คือเป้นกลุ่มก้อนของตัวเลขจำนวนเต็ม

โดยทั่วไปแล้วในหลายกรณีทั้ง ๒ ชนิดนี้ใช้แทนกันได้ ไม่ต่างกัน แต่ก็มีบางกรณีที่ต่างกัน ต้องระวังการใช้ให้ดี

เช่นสายอักขระที่สร้างจาก " " นั้นจะใกล้เคียงกับสายอักขระในภาษาอื่นๆรวมถึงไพธอนมากกว่า เช่นสามาระนำมาบวกกันเพื่อต่อกันได้ อย่างที่ในไพธอนทำแบบนี้
a = 'อะฮะฮะ'
b = 'บะนะนะ'
print(a+b) # อะฮะฮะบะนะนะ

ในแมตแล็บถ้าสร้างสายอักขระโดยใช้ " " ก็ทำแบบนี้ได้
a = "อะฮะฮะ";
b = "บะนะนะ";
disp(a+b) % อะฮะฮะบะนะนะ

แต่ว่าถ้าสร้างโดยใช้ ' ' ก็จะได้ผลออกมาแปลกๆแบบนี้
a = 'อะฮะฮะ';
b = 'บะนะนะ';
disp(a+b) % 7239        7264        7239        7264        7239        7264

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

พอนำมาบวก ชนิดของข้อมูลก็เปลี่ยนไปด้วย
class(a) % 'char'
class(a+b) % 'double'


ไม่ใช่แค่นั้น เอามาลบคูณหารก็ทำได้ด้วย
disp(a-b) % -46 5 5
disp(a.*b) % 153189600 153673206 153673206

นอกจากนี้ก็ยังมีความแตกต่างกันอีกหลายอย่าง แต่ในที่นี้แค่อยากอธิบายว่ามีความแตกต่างที่ต้องระวัง รายละเอียดถ้าเขียนถึงน่าจะยาวเป็นอีกบทความนึงได้เลยดังนั้นขอเขียนถึงแค่นี้ ที่สำคัญก็คือ อย่าเผลอเอาสายอักขระที่สร้างจาก ' ' มาบวกกันแบบในไพธอน



สถานะของเลขจำนวนเชิงซ้อน

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

ในไพธอน
type(1.) # float
type(1j) # complex

ส่่วนในแมตแล็บนั้นสร้างยังไงก็เป็น double เหมือนกัน
class(1.) % 'double'
class(1j) % 'double'

เพราะฉะนั้นเวลาคำนวณเช่นเมื่อหารากที่สองก็แสดงเป็นจำนวนเชิงซ้อนได้เลย
sqrt(-3) % 0.0000 + 1.7321i

แต่ว่าถ้าในไพธอนอาจจำเป็นต้องเปลี่ยนเป็นจำนวนเชิงซ้อนเองก่อน ไม่งั้นอาจไม่ได้ผลตามที่ต้องการ ทั้งนี้ก็ขึ้นอยู่กับวิธีการคำนวณ เช่นถ้าใช้ฟังก์ชัน sqrt ของ numpy จะได้ nan
print(np.sqrt(-3)) # nan
print(np.sqrt(complex(-3))) # 1.7320508075688772j

หรือถ้าใช้มอดูล math จะเกิดข้อผิดพลาด
from math import sqrt
print(sqrt(-3)) # ValueError: math domain error




การทำงานของ sprintf

ทั้งในแมตแล็บแลไพธอนสามารถใช้การจัดรูปข้อความแบบ sprintf ได้เหมือนกัน โดยในแมตแล็บนั้นต้องใช้ในรูปฟังก์ชัน จึงอาจไม่ได้สะดวกเท่าไพธอนที่เป็นส่วนหนึ่งของไวยากรณ์เลยเขียนได้กะทัดรัดกว่า แต่โดยรวมแล้วก็คือสามารถใช้ได้ จึงสะดวกดี

แต่ว่า sprintf ในแมตแล็บก็มีบางส่วนที่ให้ผลต่างไปจากในไพธอน จึงต้องระวังด้วย เช่นเมื่อใช้ %s ในไพธอนไม่ว่าจะข้อมูลอะไรก็แทนลงใน %s ได้ ดังนั้นอะไรๆก็ใส่ %s แบบนี้สะดวกดี
'x%3sx'%1 # 'x  1x'
'x%5sx'%1.1 # 'x  1.1x'

แต่ว่าในแมตแล็บถ้าใช้แบบนั้นจะเกิดการแสดงผลแปลกๆ ไม่เป็นไปตามที่ต้องการ
sprintf('x%3sx',1) % 'x  x'
sprintf('x%5sx',1.1) % 'x1.100000e+00x'

ดังนั้นแล้วสำหรับในแมตแล็บ %s ใช้กับข้อมูลที่เป็นสายอักขระก็พอ ถ้าเป็นจำนวนเต็มหรือเลขทศนิยมก็ใช้ %d หรือ %f ไปตามนั้น

นอกจากนี้ในไพธอนถ้าใช้ %x แต่พยายามแทนเลขทศนิยมก็จะเกิดข้อผิดพลาดได้
'%x'%1.1 # TypeError: %x format: an integer is required, not float

แต่ในแมตแล็บจะไม่เกิดข้อผิดพลาด แต่จะแสดงผลไม่ตรงตามที่ต้องการอยู่ดี
sprintf('%x',1.1) % '1.100000e+00'




วงเล็บปีกกา { }

ในไพธอนนั้นวงเล็บปีกกา { } ใช้เพื่อสร้าง set
c = {1,2,3}
type(c) # set

แต่ในแมตแล็บนั้น { } ใช้เพื่อสร้างแถบลำดับ cell
c = {1 2 3};
class(c) % 'cell'

แถวลำดับ cell ในแมตแล็บหรือ set ในไพธอนต่างก็เป็นอะไรที่คล้ายๆแถวลำดับทั่วไป แต่ว่าก็ต่างกันไป ไม่ใช่เรื่องเดียวกันเลย ดังนั้นจะสับสนไม่ได้





(ที่มาของภาพ https://realpython.com/matlab-vs-python)


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- คอมพิวเตอร์ >> เขียนโปรแกรม >> MATLAB

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

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
javascript
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  記事を検索

  おすすめの記事

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文