2017-08-31 5 views
6

オリジナルコード:イメージのディレクトリからビデオ配列を構築しているときに、予期しない動作が発生した場合、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を使用するとどうなりますか?

+3

私はこの質問に対する答えはわかりませんが、これはメモリ割り当てではなく、このようにループを作成する方法が計算時間の面で非常に悪いことがわかります。 'vid = 0 '([size(image)endframe])'に 'vid'を単に割り当てるか、イメージのサイズをあらかじめ知っておらず、サイズを取得するために最初のイメージをロードしたくない場合( 'for ii = endframe:-1:startframe')ループを' vid(:、:、:、ii)= ... 'として' vid'に保存します。適切なサイズ。 – Adriaan

答えて

5

これは、表示するものを選択するMATLABです。

MATLABでは、行列は無限次元です。

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

ご存知のように、あなたはsizeで特定の次元のサイズを照会できます。素敵な一例として、あなたのbを試すことができます。例えば。 size(b,2)1を返します。しかし、size(b,12345)は何を返しますか?まあ、行列は無限次元なので、1も返します。 12345次元では、bのサイズは1です。

しかし、入力するたびに無限の次元が出力されると、表示機能はどんなに恐ろしいでしょうか。size(b)したがって、MATLABでは、デフォルトでは2つの淡色またはN個の淡色が表示されます(Nはその上のデータで一番大きい次元です)。

このように、cの例で表示されているのは、size機能ではなく、表示機能による奇妙な動作です。 size(c,3)1を返します。これは[]が最初の2つのディメンションのサイズを0に設定するだけで、MxPx0という変数を埋め込むときに(c(:,:,end)=img、どうなるのでしょうか?end?)という本質的に空の変数です。

+0

私はなぜc = []; c(:、:、end + 1)= 1を使用するのか理解しようとします。 size(c、3)私は2を得るでしょう。私の常識は1を得るべきです。 –

+0

@AssafLivne 'size(c、3)'とは何ですか?そのサイズ+1は何ですか? –

+1

彼は彼の質問で「b」と比較することを意味すると思います。または、残りのすべてが1に設定されている間、最初の次元がゼロに設定されているのはなぜですか? – Adiel

関連する問題