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
?
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