2017-08-31 16 views
6

trong khi xây dựng một mảng video từ một thư mục hình ảnh tôi gặp phải hành vi không mong muốn. mã ban đầu:Hành vi không mong muốn khi sử dụng kết thúc để phát triển mảng

vid = []; 
for i =startframe:endframe 
    image = [directoryOfImages ,'\', images_names{1,i}]; 
    vid(:,:,:,end+1) = imread(image); 
    waitbar((i-startframe)/(endframe-startframe)); 
end 

Sau đó, tôi chạy mã này để kiểm tra điều lên:

a = []; size(a) 
a(end+1) = 1; size(a) 

Kích thước đầu tiên là [0, 0] và kích thước thứ hai là [1, 1]. Các hành vi mong đợi cùng tôi trong mã này:

b = []; size(b) 
b(:,end+1) = 1; size(b) 

Kích thước đầu tiên là [0, 0] và kích thước thứ hai là [1, 1]. Nhưng trong mã này, một cái gì đó kỳ lạ đã xảy ra:

c = []; size(c) 
c(:,:,end+1) = 1; size(c) 

trong khi đây kích thước đầu tiên là [0,0] và điều thứ hai là [1,1,2]. Điều này rất bất ngờ. Tôi in c và tôi nhận điều này:

>>c 
c(:,:,1) = 

    0 

c(:,:,2) = 

    1 

Cuối cùng, tôi chạy kịch bản này:

c=[]; c(:,:,end)=1; size(c) 

và tôi đã nhận [1, 1].

ai đó có thể giải thích những gì đang xảy ra ở đây? khi nào tôi sử dụng c=[] để nhận được một mảng trống có kích thước là [0,0,1]? vậy làm thế nào đến size(c) không đề cập đến nó? và tại sao khi tôi sử dụng c(:,:,end)=1; kích thước của nó không phải là [1,1,1]? và khi nào tôi sử dụng c(:,:,:,end)=1?

+3

Tôi không biết câu trả lời cho câu hỏi, nhưng tôi biết rằng đây không phải là cấp phát bộ nhớ và mảng phát triển theo cách này trong vòng lặp là rất xấu về thời gian tính toán. Chỉ cần phân bổ 'vid' của bạn là' vid = zeros ([end (image) endframe]) ', hoặc, nếu bạn không biết kích thước của hình ảnh trước và không muốn tải ảnh đầu tiên để có kích thước , để cho vòng lặp của bạn chạy ngược ('for ii = endframe: -1: startframe') và lưu vào' vid' là 'vid (:,:,:, ii) = ...', nó sẽ tự động khởi tạo mảng đến kích thước thích hợp. – Adriaan

Trả lời

5

Đây chỉ là MATLAB chọn nội dung hiển thị.

Trong MATLAB, ma trận là chiều vô hạn. Như một ví dụ tốt đẹp, cho phép thử của bạn b:

b = []; 
b(:,end+1) = 1; 

Như bạn đã biết, bạn có thể truy vấn các kích thước của một khía cạnh cụ thể với size. Ví dụ. size(b,2) trả về 1. Nhưng những gì hiện size(b,12345) trở lại ?, tốt, nó trả về 1 cũng như ma trận là vô hạn chiều. Trong kích thước 12345, kích thước của b1.

Tuy nhiên, chức năng hiển thị khủng khiếp sẽ là gì, nếu mỗi lần bạn nhập size(b), nó sẽ xuất ra vô số kích thước! Vì vậy, khi hiển thị, MATLAB mặc định hiển thị 2 mờ hoặc N-dims, trong đó N là chiều dài xa nhất với dữ liệu trên đó (kích thước không phải là singleton).

Vì vậy, những gì bạn đang nhìn thấy với ví dụ c là hành vi kỳ lạ của hàm hiển thị, không phải là hàm size. size(c,3) trả về 1. Điều này cũng gây ra bởi các [] chỉ thiết lập kích thước của hai kích thước đầu tiên bằng không, để tránh có một biến số MxPx0 khi điền nó lên (c(:,:,end)=img, điều gì sẽ xảy ra với end?), Về bản chất là một biến trống.

+0

Tôi cố gắng hiểu tại sao khi tôi sử dụng c = []; c (:,:, end + 1) = 1; kích thước (c, 3) Tôi sẽ nhận được 2. ý thức chung của tôi là tôi sẽ nhận được 1. –

+0

@AssafLivne 'kích thước (c, 3) 'là gì? Kích thước +1 đó là gì? –

+1

Tôi nghĩ rằng ông có nghĩa là để so sánh với 'b' trong câu hỏi của mình. Hoặc, tại sao thứ nguyên đầu tiên được đặt thành 0 trong khi tất cả các thứ nguyên được đặt thành 1? – Adiel

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