2013-04-19 13 views
5

Matlabとオクターブで関数が行列とベクトルの両方を受け入れるが、行列と同じようにベクトルでは同じことをしないさまざまな場合に気づいた。OctaveとMatlab "wat"行列とベクトルの不一致

可変数の行/列の行列を入力すると、ベクトルと解釈され、高さ/幅が1のときに期待しないことが起こり、デバッグが難しくなります。奇妙な条件付きエッジケース。

私は私が見つけたいくつかをリストアップしますが、人々は

(注に実行したものを他の人、私は好奇心が強い:私はコードのみが有効な入力として行列を受け入れるケースを探しています何という引数がカウントされないような非ベクトル行列が与えられた例外)を発生させ

1)「DIAG」行列の対角の平均値または対角行列

のでにベクトルを向けるために使用することができます前者は一般的に正方行列にしか使われていませんが、これはmatlabではそれほど厳しいものではありませんが、OctaveではOctave interperets CTOR論理名と行ベクトルへの「対角行列」すなわち

t=eye(3); 
size(diag(t(:,3))) == [3,3] 
size(diag(t(:,2))) == [3,3] 
size(diag(t(:,1))) == [1,1] 

2)インデックスは、論理名が戻ると何かに行ベクトル

インデックスを返すよう、非ゼロ要素と他のすべてのゼロで始まります列ベクトル

a = 1:3; 
b = true(1,3); 
size(a(b)) == [1, 3] 
a = [a; a]; 
b = [b; b]; 
size(a(b)) == [6, 1] 

3)iは同じ(行/ COL)のベクトルをvとして入力返すインデックスベクトルとベクトルvにインデックス。しかし、いずれか、VまたはI行列である場合、戻り値私と同じ大きさです。

a = 1:3; 
b = a'; 
size(a(b)) == [1, 3] 
b = [b,b]; 
size(a(b)) == [3, 2] 

4)MAX、MIN、等和が行列Mの列上で動作individiually Mがの1xNされていない限り、その場合、それらは単一の行ベクトル

a = 1:3 
size(max(a)) == [1, 1] 
a = [a;a] 
size(max(a)) == [1, 3] 

maxとM上で動作します引数として次元をとることさえできないので、特に悪いです(和とは異なり)

オクターブ/ MATLABコードを書くときは、他に何か注意すべきですか?

+0

max/minの次元を指定することができます: 'min(rand(3)、[]、1)'または 'max(rand(3)、[]、2)' – Amro

答えて

1

各言語にはそれぞれ独自の概念があります。この言語の重要な点は、行列をベクトルの配列と考えることが非常によくあります。各列はエントリです。物事はその後意味をなさないでしょう。その振る舞いが望ましくない場合は、行列ではなく単一のベクトルを渡す関数の引数としてmatrix(:)を使用します。例:

octave> a = magic (5); 
octave> max (a) 
ans = 

    23 24 25 21 22 

octave> max (a(:)) 
ans = 25 

1)これは少なくともOctave 3.6.4では当てはまりません。私は100%確信していませんが、すでに修正されているthis bugに関連している可能性があります。

2)ブール値でインデックスすると、マスクとみなされ、そのように扱われます。ブール値以外の値でインデックスすると、値のインデックスとして扱われます。これは私には完璧な意味があります。

3)これは当てはまりません。返されるインデックスのサイズは、マトリックスまたはベクトルの場合は常に同じです。例外は、インデックスがベクトルの場合、出力は単一の行になります。アイデアは、単一のベクトル/行列を持つインデックスは、同じサイズのものを返すことです。

octave> a = 4:7 
a = 

    4 5 6 7 

octave> a([1 1]) 
ans = 

    4 4 

octave> a([1 3]) 
ans = 

    4 6 

octave> a([1 3; 3 1]) 
ans = 

    4 6 
    6 4 

4)max少なくともオクターブ内の引数としての寸法がかかります。の3.6.4ヘルプテキストから:

ベクトル引数の場合、最大値を返します。行列 引数の場合は、各列の最大値を行ベクトル またはDIMが定義されている場合はそれを返します。この場合、Yは空の行列 に設定する必要があります(そうでない場合は無視されます)。

残りは、私がイントロで言ったように適用されます。行列を指定すると、各列はデータセットとみなされます。

+2

私はしません私が尋ねてきたことを理解してくれたと思う。 私は一般的にベクトルが行列として扱われないと訴えていましたが(私の問題は行列がベクトルとして扱われないということだと思われたのに対して) 2の場合は、ブーリアンでインデックスするだけで、いずれの場合もそうではない)、一方は行ベクトルを返し、他方は列ベクトルを返す。 ケース3では、あなたが言及している例外はまさに私が不平を言っているものです。インデックスを作成する必要のある行列がありますが、行列に可変数の列がある場合、その1つの例外のif文を1つだけ書く必要があります – dspyz

0

1)他のユーザーから指摘されているように、これはOctave> = 3.6.4では正しくありません。

ケース2)ルールがベクトルのためであるで

、列ベクトルを返す何か他のもののために、常にベクトルの同じ形状を返す、考えてみます。

>> a = reshape (1:3, 1,1,3) 

a(:,:,1) = 

    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 

>> b = true(1,3) 

b = 

    1×3 logical array 

    1 1 1 

>> a(b) 

ans(:,:,1) = 

    1.0000e+000 


ans(:,:,2) = 

    2.0000e+000 


ans(:,:,3) = 

    3.0000e+000 

>> a = [a;a] 

a(:,:,1) = 

    1.0000e+000 
    1.0000e+000 


a(:,:,2) = 

    2.0000e+000 
    2.0000e+000 


a(:,:,3) = 

    3.0000e+000 
    3.0000e+000 

>> b = [b;b] 

b = 

    2×3 logical array 

    1 1 1 
    1 1 1 

>> a(b) 

ans = 

    1.0000e+000 
    1.0000e+000 
    2.0000e+000 
    2.0000e+000 
    3.0000e+000 
    3.0000e+000 

あなたはベクトルが持っているので、これは理にかなっていることがわかります'direction'をクリアしますが、要素を削除しても他の整形された行列はありません。編集:実際に私はちょうどチェックし、Octaveはこのように正確には動作していないようですが、おそらく必要があります。

3)これは2)と一致しています。基本的に、インデックスのリストを指定すると、インデックス付きベクトルの方向が保持されます。行列のような形をしたインデックスを与えると、新しい情報はインデックス行列の形が使用されます。あなたが望むなら、の形を保つために常にa(b(:))を行うことができるので、これはより柔軟です。一貫性がないと言うかもしれませんが、論理を使ってインデックスを作成すると、返される要素の数が減り、このように再構成することはできません。 またはmax(rand(3),[],2)の場合、コメントに指摘されているとおり、最大/最小のディメンションを指定できますが、この場合、これらの機能には、最初のデータに戻ってくる「従来の」問題があります人々を動揺させることなく変更することは非常に困難です。

関連する問題