6

関数が行列とベクトルの両方を受け入れる Matlab とオクターブのさまざまなケースに気付きましたが、行列の場合と同じことをベクトルで行いません。

可変数の行/列を持つ行列を入力すると、ベクトルとして解釈され、高さ/幅が 1 の場合に予期しないことを実行して、デバッグが困難になり、奇妙な条件付きエッジ ケースが発生する可能性があるため、これはイライラする可能性があります。 .

私が見つけたいくつかをリストしますが、他の人が何に遭遇したのか興味があります

(注: コードが有効な入力として行列を受け入れる場合のみを探しています。非ベクトル行列が引数として指定されたときに例外が発生するものはすべてカウントされません)

1) 「diag」は、行列の対角を意味するか、ベクトルを対角行列に変換するために使用できます。

前者は一般に正方行列にのみ使用されるため、これは matlab ではそれほどひどいものではありませんが、Octave では、Octave がゼロ以外の要素で始まるベクトルを解釈し、他のすべてが「対角行列」としてゼロになる場合に特に苦痛になる可能性があります。

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 を使用してベクトル v にインデックスを付けると、v と同じ (行/列) 型のベクトルが返されます。ただし、v または i のいずれかが行列の場合、戻り値は i と同じサイズになります。

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

4) max、min、sum などは、M が 1xn でない限り、行列 M の列を個別に操作します。この場合、それらは M を単一の行ベクトルとして操作します。

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

max は、次元を引数として取ることさえできないため、特に悪いです (合計とは異なります)。

octave/matlab コードを記述する際に、他にどのようなケースに注意する必要がありますか?

4

2 に答える 2