2013-04-19 69 views
5

Tôi đã nhận thấy các trường hợp khác nhau trong Matlab và octave trong đó hàm chấp nhận cả ma trận và vec-tơ, nhưng không thực hiện tương tự với vec-tơ như với ma trận. Điều này có thể gây phiền toái vì khi bạn nhập một ma trận với một số hàng/cột có thể thay đổi, nó có thể được hiểu là vectơ và làm điều gì đó bạn không mong đợi khi chiều cao/chiều rộng là 1 để gỡ lỗi và trường hợp cạnh có điều kiện lạ.Octave và Matlab "wat" ma trận/vector mâu thuẫn

tôi sẽ liệt kê một vài tôi đã tìm thấy, nhưng tôi tò mò những gì người khác người đã chạy vào

(Lưu ý:. Tôi chỉ tìm kiếm cho trường hợp mã chấp nhận ma trận như là đầu vào hợp lệ Bất cứ thứ gì đặt ra một ngoại lệ khi một ma trận phi vector được đưa ra như một cuộc tranh cãi không được tính)

1) "diag" có thể được sử dụng để có nghĩa là đường chéo của một ma trận hoặc bật một vector thành một ma trận đường chéo

Kể từ trước đây thường chỉ được sử dụng cho ma trận vuông này không phải là quá nghiêm trọng trong MATLAB, nhưng trong Octave nó có thể đặc biệt đau đớn khi Octave interperets một ctor đầu với một yếu tố khác không và tất cả những gì số không khác như là một "ma trận đường chéo" tức là

t=eye(3); 
size(diag(t(:,3))) == [3,3] 
size(diag(t(:,2))) == [3,3] 
size(diag(t(:,1))) == [1,1] 

2) Indexing vào một hàng-vector với logicals trả về một hàng-vector

Indexing vào bất cứ điều gì khác với logicals lợi nhuận một vector cột

a = 1:3; 
b = true(1,3); 
size(a(b)) == [1, 3] 
a = [a; a]; 
b = [b; b]; 
size(a(b)) == [6, 1] 

3) Indexing thành một v vector với một véc tơ chỉ số i trả về một vector của cùng (hàng/col) gõ như v. Nhưng nếu một trong hai v hoặc tôi là một ma trận, giá trị trả về có cùng kích thước với tôi.

a = 1:3; 
b = a'; 
size(a(b)) == [1, 3] 
b = [b,b]; 
size(a(b)) == [3, 2] 

4) max, min, sum, vv hoạt động trên các cột của một ma trận M individiually trừ khi M là 1xN trong trường hợp mà họ hoạt động trên M như một đơn hàng-vector

a = 1:3 
size(max(a)) == [1, 1] 
a = [a;a] 
size(max(a)) == [1, 3] 

max đặc biệt xấu vì nó thậm chí không thể lấy tham số (không giống như tổng)

Tôi nên xem những trường hợp nào khác khi viết mã octave/matlab?

+0

chỉ để làm rõ: bạn có thể chỉ định thứ nguyên cho tối đa/phút: 'phút (rand (3), [], 1)' hoặc 'max (rand (3), [], 2)' – Amro

Trả lời

1

Mỗi ngôn ngữ có khái niệm riêng. Một điểm quan trọng của ngôn ngữ này là rất thường nghĩ về ma trận như một mảng vectơ, mỗi cột một mục. Mọi thứ sẽ bắt đầu có ý nghĩa sau đó. Nếu bạn không muốn hành vi đó, hãy sử dụng matrix(:) làm đối số cho các hàm đó sẽ chuyển một véc tơ đơn, thay vì một ma trận. Ví dụ:

octave> a = magic (5); 
octave> max (a) 
ans = 

    23 24 25 21 22 

octave> max (a(:)) 
ans = 25 

1) Điều này không đúng với ít nhất Octave 3.6.4. Tôi không chắc chắn 100% nhưng có thể liên quan đến this bug đã được sửa.

2) Nếu bạn lập chỉ mục với giá trị boolean, nó sẽ được coi là mặt nạ và được xử lý như vậy. Nếu bạn lập chỉ mục với các giá trị không boolean, thì nó được coi là các chỉ mục cho các giá trị. Nó có ý nghĩa tuyệt vời với tôi.

3) Điều này không đúng. Giá trị trả về luôn có cùng kích thước của chỉ mục, độc lập nếu đó là ma trận hoặc vectơ. Ngoại lệ duy nhất là nếu chỉ mục là một vectơ, đầu ra sẽ là một hàng duy nhất.Ý tưởng là lập chỉ mục với một vector đơn/ma trận trở về một cái gì đó có cùng kích thước:

octave> a = 4:7 
a = 

    4 5 6 7 

octave> a([1 1]) 
ans = 

    4 4 

octave> a([1 3]) 
ans = 

    4 6 

octave> a([1 3; 3 1]) 
ans = 

    4 6 
    6 4 

4) max không mất chiều kích như là đối số ít nhất là trong Octave. Từ văn bản trợ giúp 3.6.4 của max:

Đối với đối số vectơ, trả về giá trị lớn nhất. Đối với đối số ma trận, trả lại giá trị tối đa từ mỗi cột, dưới dạng vectơ hàng, hoặc qua tham số DIM nếu được xác định, trong trường hợp này Y phải được đặt thành ma trận trống (bị bỏ qua nếu không).

Phần còn lại áp dụng như tôi đã nói trên phần giới thiệu. Nếu bạn cung cấp ma trận, nó sẽ nghĩ về mỗi cột dưới dạng tập dữ liệu.

+2

Tôi không nghĩ rằng bạn hiểu những gì tôi đã hỏi về. Tôi thường phàn nàn rằng vectơ không được coi là ma trận (trong khi bạn dường như nghĩ rằng vấn đề của tôi là ma trận không được coi là vectơ) Trong trường hợp 2, tôi chỉ lập chỉ mục với boolean, không bao giờ bằng số học không phải trong cả hai trường hợp), nhưng một trả về một vectơ hàng và một vectơ cột khác. Trong trường hợp 3, ngoại lệ bạn đề cập đến chính xác là những gì tôi đang phàn nàn. Nếu tôi có một ma trận mà tôi cần phải lập chỉ mục nhưng ma trận có một số cột thay đổi, thì tôi phải viết một câu lệnh if cho một ngoại lệ đó chỉ với 1 – dspyz

0

1) Như được chỉ ra bởi người dùng khác, điều này không đúng với Octave> = 3.6.4.

Trong trường hợp 2) quy tắc là cho vectơ, trở về lúc nào cũng là hình dạng tương tự của vector, cho bất cứ điều gì khác trả về một vector cột, hãy xem xét:

>> a = reshape (1:3, 1,1,3) 

a(:,:,1) = 

    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 

>> b = true(1,3) 

b = 

    1×3 logical array 

    1 1 1 

>> a(b) 

ans(:,:,1) = 

    1.0000e+000 


ans(:,:,2) = 

    2.0000e+000 


ans(:,:,3) = 

    3.0000e+000 

>> a = [a;a] 

a(:,:,1) = 

    1.0000e+000 
    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 
    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 
    3.0000e+000 

>> b = [b;b] 

b = 

    2×3 logical array 

    1 1 1 
    1 1 1 

>> a(b) 

ans = 

    1.0000e+000 
    1.0000e+000 
    2.0000e+000 
    2.0000e+000 
    3.0000e+000 
    3.0000e+000 

Bạn có thể thấy rằng đây có ý nghĩa kể từ vectơ có một rõ ràng 'hướng' nhưng ma trận có hình dạng khác không khi bạn loại bỏ các yếu tố. EDIT: thực sự tôi chỉ cần kiểm tra và Octave dường như không hoạt động theo cách này chính xác, nhưng có lẽ nên.

3) Điều này phù hợp với 2). Về cơ bản nếu bạn cung cấp một danh sách các chỉ mục thì hướng của vectơ được lập chỉ mục được giữ nguyên. Nếu bạn cung cấp các chỉ mục có hình dạng như ma trận, thông tin mới là hình dạng ma trận chỉ mục được sử dụng. Điều này linh hoạt hơn vì bạn luôn có thể làm a(b(:)) để giữ hình dạng a nếu bạn muốn. Bạn có thể nói nó không nhất quán, nhưng hãy nhớ lập chỉ mục với các lô-gic có thể làm giảm số lượng các phần tử được trả về, vì vậy chúng không thể được định hình lại theo cách này.

4) Như đã chỉ ra trong nhận xét, bạn có thể chỉ định thứ nguyên cho tối đa/phút để hoạt động trên: min(rand(3),[],1) hoặc max(rand(3),[],2), nhưng trong trường hợp này, có các vấn đề 'cũ' với các chức năng này. tạo ra và bây giờ rất khó thay đổi mà không làm xáo trộn mọi người.

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