2015-09-29 15 views
17

Tôi đã rất ngạc nhiên ngày hôm nay để khám phá ra rằngTại sao dấu phẩy sau trong một cú pháp Matlab hợp lệ của mảng ô?

A = {1,2,3} 

B = {1,2,3,} 

đều cú pháp hợp lệ trong MATLAB. Tôi đã có thể dự kiến ​​tuyên bố thứ hai để mang lại một lỗi. Tốt nhất là tôi có thể nói, họ sản xuất các mảng tế bào giống hệt nhau (all([A{:}]==[B{:}]) trả về true).

Có lý do nào để cho phép cú pháp thứ hai không? Đây có phải là lỗi trong trình phân tích cú pháp không? Có phải AB thực sự giống nhau không?

Ngạc nhiên hơn nữa, sau đây là không phép:

C = {1,2,3,,,} 
+8

Thú vị. '{1,2,4, ;;;; 4,5,6 ;;;}' cũng cho phép –

+0

Tôi nhớ đã khám phá ra điều này bằng cách sử dụng ngôn ngữ này một chút trong [câu trả lời này] (http://stackoverflow.com/ a) 28334571/3121310) nhưng chưa bao giờ tìm cách làm rõ từ MathWorks về nó. Tôi sẽ viết nó lên một trường hợp đặc biệt mà trình phân tích cú pháp xử lý tương tự như một ma trận với kích thước '0' trong một chiều, nhưng ví dụ của @ LuisMendo đặt ra các câu hỏi về các chi tiết cụ thể. – TroyHaskin

+1

@LuisMendo những gì thực sự làm tôi khó hiểu là nó kết thúc một hình chữ nhật đẹp, chặt chẽ. Có vẻ như ít nhất phải có một số hàng trống trong đó hoặc một cái gì đó ... – chessofnerd

Trả lời

23

Đây là những hơn dự đoán, chứ không phải là một câu trả lời.

Người ta có thể kiểm tra Symbol reference và thấy rằng dấu phẩy , có thể được sử dụng như

lệnh hoặc Báo cáo Separator

Để nhập nhiều hơn một lệnh MATLAB hoặc tuyên bố trên cùng một dòng , tách riêng mỗi lệnh hoặc câu lệnh bằng dấu phẩy:

for k = 1:10, sum(A(k)), end

Trong dòng

B = {1,2,3,} 

do đó một tuyên bố sau khi 3 dự kiến, đó chỉ là }, có nghĩa cuối của mảng di động, một tuyên bố hợp lệ.


Các dấu chấm phẩy ; có ba tập quán chính thức:

Mảng Row Separator

Khi sử dụng trong dấu ngoặc vuông để tạo ra một mảng mới hoặc nối mảng hiện có, dấu chấm phẩy tạo một hàng mới trong mảng:

A = [5, 8; 3, 4]

Output Suppression

Khi đặt ở phần cuối của một lệnh, dấu chấm phẩy nói với MATLAB không hiển thị bất kỳ đầu ra từ lệnh đó.Trong ví dụ này, MATLAB không hiển thị kết quả 100-by-100 matrix:

A = ones(100, 100);

lệnh hoặc Báo cáo Separator

Giống như các nhà điều hành dấu phẩy, bạn có thể nhập nhiều hơn một lệnh MATLAB trên một dòng bằng cách tách từng lệnh bằng dấu chấm phẩy. MATLAB ngăn chặn đầu ra cho các lệnh đó được chấm dứt bằng dấu chấm phẩy và hiển thị đầu ra cho các lệnh được chấm dứt bằng dấu phẩy.

Trong ví dụ này, các nhiệm vụ cho biến A và C được chấm dứt bằng dấu chấm phẩy và do đó không hiển thị. Bởi vì sự phân công đến B là bằng dấu phẩy chấm dứt, đầu ra của một lệnh này được hiển thị:

A = 12.5; B = 42.7, C = 1.25;

Vì vậy, trong dòng

x = {1,2,3,;5,6,7} 

nó sau báo cáo kết quả hợp lệ Mảng Row Dấu phân cách sau 3,. Sau đó, một tuyên bố mới được dự kiến, trong trường hợp này là số . Có hiệu lực.


Bây giờ xem xét các trường hợp

x = {1,2,3,;;;;4,5,6;;;} 

Như trên sau 3, sau tuyên bố Mảng Row Separator, và báo cáo kết quả sau đó là lẽ các null statement - NOP mượn từ một số lõi chương trình cơ bản viết bằng C, về cơ bản có nghĩa là: không làm gì. Vì vậy, sau khi 3,; theo dõi ba lần "không làm gì", trước khi có câu lệnh tiếp theo. Làm cho không có ý nghĩa, như Matlab đang nói với bạn: Dấu chấm phẩy bổ sung là không cần thiết. - nhưng hợp lệ.

Nó cũng cho phép bạn điều vô nghĩa như:

if true 
    ; 
end 

Và đây là lẽ cũng là lý do tại sao

C = {1,2,3,,,} 

trả về một lỗi, vì dấu phẩy , isn' t a tuyên bố không có số, nhưng sau dấu phẩy đầu tiên có dấu dự kiến ​​atement.


Điểm mấu chốt: có vẻ lạ, nhưng thực sự có vẻ logic với tôi, vì Matlab sử dụng rất nhiều mã C trong nội bộ và xem xét tuyên bố null, mọi thứ được đề cập là cú pháp hợp lệ.


Còn các ngôn ngữ khác thì sao?

dấu chấm phẩy được sử dụng như x = [1,2,3,;;;;4,5,6;;;] bằng Python là không hợp lệ, ngay cả trong ý định Matlab bản sao NumPy, trừ khi quấn vào cú pháp phổ biến này a = np.matrix('1,2,3;4,5,6').

a = np.matrix('1,2,3,;;;;4,5,6;;;') 

sẽ ném ra một lỗi là tốt, như ; được hiểu như là Mảng Row Separator trong mọi trường hợp, mà làm cho trình biên dịch phàn nàn về kích thước hàng không đồng nhất.

Tuy nhiên,

x = [1,2,3,] 

cũng là cú pháp hợp lệ trong PythonIronPython, vì nó là trong VBScriptLua như đã đề cập trong mlepage's answer. Tất cả những ngôn ngữ này có điểm gì chung? Họ là tất cả (nhiều hay ít) ngôn ngữ kịch bản được giải thích trong thời gian chạy. Nó không chỉ là Matlab. Sự phấn khích của OP do đó vẫn không có nguyên nhân.

+0

Điều đó thực sự có ý nghĩa hoàn hảo. Cảm ơn lời giải thích. +1. – rayryeng

+6

Tôi tò mò muốn ném cái này vào MathWorks và xem họ có trả lời không! – excaza

0

Thật thuận tiện để cho phép dấu chấm câu bằng các ngôn ngữ nếu bao giờ mã sẽ được tạo từ mã khác.

Ví dụ: Lua cho phép dấu phẩy, vì vậy thật dễ dàng để tạo mã Lua.

Bạn không phải đặc biệt khi mã tạo ra bỏ qua dấu phẩy cuối cùng, bạn chỉ có thể in ITEM-THEN-COMMA cho mỗi mục.

+0

Không, thực sự không làm điều này – Wolfie

Các vấn đề liên quan