3

次のように、インデックス付きベクトルとインデックス付き行列の積を合計しようとしています。

k=[0:1:N-1]  
n=[0:1:N-1]  
x_n = sin(pi*n)  
N = size(x_n,2)  
_seqgen(x_n(n)*exp(k*n/N), n, 0..N-1)  

しかし、私はエラーが発生します:

error: subscript indices must be either positive integers or logicals  

ここで何が欠けていますか?

編集:生成されたシーケンスを合計する _plus 関数を見逃したことに気付きました。次のようになります。

k=[0:1:N-1]  
n=[0:1:N-1]  
x_n = sin(pi*n)  
N = size(x_n,2)  
_plus(_seqgen(x_n(n)*exp(k*n/N), n, 0..N-1))  

それでも同じエラーが発生します...

4

2 に答える 2

10

エラー メッセージは何が問題なのかを説明しています。正の整数でも論理値でもない数値で配列にインデックスを付けようとしています。コード内の唯一の配列インデックスはx_n(n). そして案の定、この行は、 が正の数ではないためn=[0:1:N-1]、インデックスnが正ではないことを示してい0ます。レッスン: MATLAB/Octave は常に 1 からインデックスを作成します。 これは知っておく必要がある基本的なものであるため、いくつかの実際のチュートリアルをお勧めします。

于 2013-03-08T23:23:16.083 に答える
2

あなたがこれで初心者であると認めたので、私にあなたのコードのいくつかの批評を提供させてください。まず、ベクトルを作成します

n = [0:1:N-1];

ちなみに、これは角かっこを必要とせず、次のように書くことができます。

n = 0:N-1;

x_n次に、指定された値に対してすべてゼロになるベクトルを生成します(sin(pi*n)の整数値の場合は== 0 n)。

次に、奇妙なことをします。前に定義しnた配列によく似た変数をループして、シンボリックシーケンスを生成しているように見えます。nそれをどうすればいいのかわからない-素晴らしいアイデアとは思えない。@jazzbassrobでさえ、これによって混乱していることに注意してください。「ゼロでインデックスを作成できません」というエラーが発生したのは、ベクトルの値が原因ではなく、_seqgenコマンドでnループしているためです(同じではありません)。0..N-1たまたま同じ値ですが)。

その_seqgen式ではexp(k*n/N)、このコンテキストnでステップスルーされる変数であるため、どちらが機能するかがわかります-Matlab0..N-1が以前の定義を調べていた場合n、次元の不一致のために別のエラーがスローされます(*は行列乗算演算子であり、最初の要素の2番目の次元=2番目の要素の最初の次元)。

あなたがやろうとしていることをするためのより標準的な方法は

mySum = sum(x_n.*exp(k.*n/N));

これは、 x_nの項と、expの要素ごとの積の要素ごとの乗算を行いkます。nN

注-これが実際に「より良い」かどうかは、結果をどのように処理するかによって異なります(上記で評価されます)。

于 2013-03-09T04:18:51.307 に答える