オリジナルコード:イメージのディレクトリからビデオ配列を構築しているときに、予期しない動作が発生した場合、end to grow配列を使用しているときに予期しない動作が発生します。
vid = [];
for i =startframe:endframe
image = [directoryOfImages ,'\', images_names{1,i}];
vid(:,:,:,end+1) = imread(image);
waitbar((i-startframe)/(endframe-startframe));
end
は、その後、私は事を確認するために、このコードを実行しました:
a = []; size(a)
a(end+1) = 1; size(a)
最初のサイズは[0, 0]
だったと第2のサイズは[1, 1]
ました。私はこのコードに入った同じ期待される動作:
b = []; size(b)
b(:,end+1) = 1; size(b)
は、最初のサイズは[0, 0]
だったと第2のサイズは[1, 1]
ました。しかし、このコードでは、奇妙な何かが起こった:
c = []; size(c)
c(:,:,end+1) = 1; size(c)
をここで最初のサイズは[0,0]
た2つ目は[1,1,2]
ありました。 これはまったく予想外でした。私はc
印刷され、私はこれだ:最後に
>>c
c(:,:,1) =
0
c(:,:,2) =
1
を、私はこのスクリプトを実行しました:
c=[]; c(:,:,end)=1; size(c)
を、私は[1, 1]
を得ました。
誰かがここで何が起こっているのか説明できますか? c=[]
を使用すると、サイズが[0,0,1]
の空の配列が得られますか?どのように来てsize(c)
それを言及していない?なぜc(:,:,end)=1;
を使用した場合、そのサイズは[1,1,1]
ではないのですか?私がc(:,:,:,end)=1
を使用するとどうなりますか?
私はこの質問に対する答えはわかりませんが、これはメモリ割り当てではなく、このようにループを作成する方法が計算時間の面で非常に悪いことがわかります。 'vid = 0 '([size(image)endframe])'に 'vid'を単に割り当てるか、イメージのサイズをあらかじめ知っておらず、サイズを取得するために最初のイメージをロードしたくない場合( 'for ii = endframe:-1:startframe')ループを' vid(:、:、:、ii)= ... 'として' vid'に保存します。適切なサイズ。 – Adriaan