2014-06-13 23 views
5

Ai đó có thể giải thích tại sao ví dụ A kết quả là vector 1x6 (có ý nghĩa và là điều tôi mong đợi) trong khi ví dụ B kết quả là vector 1x4?Lập chỉ mục thành vector

Ví dụ B nếu tôi xác định trước kích thước của newvec là vector 1x6 thì kết quả là vector 1x6 chính xác. Chỉ cần không hiểu những gì đang xảy ra.

Ví dụ A

vec = [0 2 3 0 5 0]  %1x6 
newvec(vec == 0) = 1 %produces a 1 x 6 vector 

Ví dụ B

vec = [0 2 3 0 5 3]  %1 x 6 
newvec(vec == 0) = 1 %produces a 1 x 4 vector 
+0

ví dụ của bạn không có ý nghĩa. vui lòng thêm mã chính xác cho sự cố bạn gặp phải. mã bạn đã thêm luôn cung cấp một vector 1x6 – ASantosRibeiro

+1

@ASantosRibeiro: không nếu bạn phát hành 'newvec' rõ ràng trước mỗi ví dụ :) –

+1

+1 câu hỏi thú vị. Các câu trả lời cung cấp cho bạn một ý tưởng về những gì đang xảy ra, nhưng chỉ để thêm một cái gì đó. Nếu bạn không có một vectơ trong không gian làm việc và tạo nó bằng cách gán giống như 'A (5) = 1' chẳng hạn (nơi' A' không tồn tại trước đó), matlab sẽ tạo A đủ lớn để đặt '1 'trong phần tử thứ 5 và điền phần còn lại bằng số không. Thử nó. Ngoài ra, bạn cũng có thể mở rộng ma trận theo cách này, ví dụ 'x = 1: 5; x (10) = 1', hãy thử điều đó và bạn sẽ thấy nó lấp đầy các phần tử 6 - 9 với số không. Tôi đoán bạn có thể nghĩ về vấn đề của bạn theo cách tương tự, bạn đã nói với MATLAB để gán cho các vị trí 1 & 4 để nó dừng lại ở 4 – Dan

Trả lời

3

EDIT: Nhờ Dan để chỉ ra lỗi.

vec == 0 tạo ma trận logic. Bây giờ nếu kích thước của newvec không được xác định thì newvec(vec==0) =1 sẽ luôn tạo một hàng mới hàng vectơ newvec.

Các bước sau đây sẽ quyết định kích thước của này newvec

temp1 = logical_matrix(:); 
trailing_zeros = number of zeros after the occurrence of last `true` value in temp1 
size(newvec) = [1, numel(logical_matrix) - trailing_zeros] ; 

Khi bạn ấn định trước kích thước của newvec sau đó newvec(v==0) = 1 không thể thay đổi kích thước của newvec, nó chỉ gán 1 để các chỉ số tương ứng mà vec==0true.

+3

"sẽ tạo một véc tơ newvec có kích thước bằng với số giá trị true (cái) trong ma trận logic" không đúng, 'newvec' sẽ là kích thước của vị trí của giá trị' true' cuối cùng trong ma trận logic của bạn , không phải số giá trị 'true'. – Dan

+2

* "... có kích thước bằng với số giá trị true (cái) trong ma trận lôgíc, trong trường hợp này là 4" *, thì điều đó không đúng bây giờ phải không? Bởi vì kích thước của 'newvec' trong ví dụ A là 1 × 6, trong khi chỉ có 3' trues' trong 'vec' gốc. Kích thước của 'newvec' phụ thuộc vào vị trí của * last *' true', điều này khá lạ. –

+0

@Nantant: Tôi đã nhận thấy rằng đôi khi bạn mắc lỗi trong cú pháp MATLAB của bạn trong các câu trả lời và nhận xét của bạn. Đề nghị bạn thực sự sử dụng MATLAB và lặp lại đầu ra cho màn hình trước khi viết câu trả lời của bạn cho lần sau. Bằng cách đó bạn không đánh lừa OP cũng như những người khác đọc câu trả lời của bạn. – rayryeng

4

Tại sao, chúng tôi sẽ không bao giờ biết. Đó là một sự lựa chọn thiết kế của MathWorks, và IMHO, nó thực sự vi phạm các principle of least surprise.

Nó có mùi một chút premature optimization (về cách sử dụng RAM) và/hoặc nội bộ của MATLAB thực hiện cuộc gọi đến find trước khi chuyển nhượng hoặc tương tự. Nhưng đó là đoán của bất cứ ai, thực sự.

Một cách phổ biến hơn để làm những gì bạn muốn, là thế này:

newvec = (vec == 0); 
4

Nếu newvec không tồn tại khi bạn gọi dòng thứ hai, MATLAB chỉ làm cho nó lớn như nó cần phải giữ các chỉ số bạn đang đặt thành 1.

Những gì bạn đang thực sự làm là:

newvec([1 4 6]) = 1; hoặc

newvec([1 4]) = 1;

Tương tự, nếu vec đã thực sự là một 2D/3D, vv ma trận, newvec sẽ đi ra như 1 x N, trong đó N là bất kể số chỉ mục cao nhất là gì và không giữ lại hình dạng của ma trận gốc.

Vì vậy, trong những trường hợp này bạn cần phải hoặc là:

1) preallocate newvec là kích thước của vec đầu tiên.

2) Làm newvec = (vec==0) thay vì

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