2013-09-23 64 views
7

Sau khi tìm thấy một số logic trong how empty structs are dealt with, tôi muốn kiểm tra cách tổng quát này thành ma trận.Sự khác biệt giữa phần tử đầu tiên của ma trận 1x1 và tất cả các phần tử của ma trận 1x1

Ở đây tôi nhận thấy những điều sau đây:

Nếu bạn có ma trận 1x1 và gán cho phần tử đầu tiên. Nó không giống như gán cho tất cả các phần tử.

Điều này khiến tôi ngạc nhiên vì yếu tố đầu tiên thực sự giống như tất cả các yếu tố trong trường hợp này. Dưới đây là những quan sát của tôi:

x = 1; 
y = 1; 
z = 1; 

x(:) = []; % Evaluates to [] as I expected 
y(1) = []; % Evaluates to Empty matrix: 1-by-0, rather than [] 
z(1,1) = []; %Throws an error: 'Subscripted assignment dimension mismatch.' even though size(z) gives [1 1]; 
z(1,:) = []; % Evaluates to Empty matrix: 0-by-1, just like z(:,:) = [] 

Sau khi nhìn thấy câu hỏi này của tôi là:

Tại sao gán để điều tương tự theo những cách khác nhau, dẫn đến bốn kết quả khác nhau?

+3

Bạn có quan tâm hoặc đây có phải là vấn đề thực sự cho bạn không? –

+1

@DennisJaheruddin Bạn nên làm việc trong nhóm QA của TMW :) –

+0

@SamRoberts Câu hỏi * tại sao * hầu hết không quan tâm, nhưng đặc biệt là sự khác biệt giữa tình huống thứ nhất và thứ tư khiến tôi lo lắng về mã nguồn của mình. Do đó nó không chỉ là một câu hỏi mà còn là một cảnh báo. –

Trả lời

9

Nó có vẻ giống như một điều nhất quán.

Cho phép xem xét một ma trận lớn hơn và xem nếu hành vi này là phù hợp với một 1 -by- 1 ma trận (cảnh báo spoiler, đó là theo ý kiến ​​của tôi):

X = rand(3); 

Trường hợp 1:

X(1,1) = [] 

Sẽ không có ý nghĩa gì khi tính năng này hoạt động. Chúng tôi không thể bảo toàn hình dạng và thả một phần tử duy nhất do đó chúng tôi gặp lỗi không khớp kích thước, phù hợp với quan sát của bạn. Ngoài ra thứ nguyên không phù hợp là một lỗi thích hợp khi chúng tôi đang cố gắng buộc một ma trận 0 -by- 0 vào một vị trí 1 -by- 1. (BTW trên một mặt lưu ý bạn nói size(z) mang đến cho bạn [1 1] nhưng size(z, 3) cũng cung cấp cho bạn 1 và do đó, size(z,7) vv vì vậy thực sự đó là một ma trận [1 1 1 ...)

Trường hợp 2:

X(1) = [] 

Điều này dẫn đến một X sao cho size(X)1 -by- 8, MATLAB có vẻ vui khi tuyến tính ma trận của bạn nếu bạn chỉ định chỉ mục tuyến tính. Điều này làm cho ý nghĩa với tôi, và một lần nữa là phù hợp với các trường hợp 1 -by- 1 kể từ khi nó kết quả trong một ma trận 1 -by- numel(X)-1 (tức 1 -by- 0 cho X = 1)

Trường hợp 3:

X(1,:) = [] 

Đó là khá thẳng về phía trước, xóa hàng đầu tiên vì vậy bây giờ chúng tôi có một ma trận n-1 -by- m. Vì vậy, 3 -by- 3 sẽ trở thành một 2 -by- 3 vì vậy tôi hài lòng với một số điện thoại 1 -by- 1 trở thành một 0 -by- 1 trong trường hợp này. Lưu ý rằng X(:,1) = [] cũng nhất quán trong một tĩnh mạch tương tự.

Trường hợp 4:

X(:) = [] 

Cái này chỉ có ý nghĩa, lại gán toàn bộ ma trận. Không vấn đề. Không mơ hồ.

Vì vậy, mặc dù chắc chắn, tất cả chúng đều có thể có ý nghĩa giống nhau. Tôi nghĩ rằng đó là một sự lựa chọn thiết kế hoàn hảo hợp lý cho MATLAB để có kết quả khác nhau phù hợp với ma trận lớn hơn so với luôn luôn làm điều tương tự cho một ma trận phần tử duy nhất.

+1

typo: trường hợp 3 phải là 'X (1,:) = []' để nhất quán với mô tả – Amro

+0

@Amro Cảm ơn, đã sửa – Dan

+5

@Dan Làm thế nào rõ ràng tất cả dường như bây giờ! :-) –

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