kesalahan oktaf: indeks subskrip harus berupa bilangan bulat positif atau logika

Saya mencoba menjumlahkan produk dari vektor yang diindeks dan matriks yang diindeks seperti ini:

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)  

tapi saya mendapatkan kesalahan:

error: subscript indices must be either positive integers or logicals  

Apa yang kulewatkan di sini?

EDIT: Saya baru menyadari bahwa saya melewatkan fungsi _plus untuk menjumlahkan urutan yang dihasilkan. Seharusnya terlihat seperti ini:

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))  

Saya masih mendapatkan kesalahan yang sama ...


person Cesar    schedule 08.03.2013    source sumber
comment
Saya lupa menyebutkan bahwa saya baru mulai menggunakan matlab/oktaf. Saya telah mencari secara online berbagai cara untuk melakukan ini tetapi saya bingung.   -  person Cesar    schedule 09.03.2013


Jawaban (2)


Pesan kesalahan menjelaskan apa yang salah: Anda mencoba mengindeks array dengan angka yang bukan bilangan bulat positif atau logis. Satu-satunya pengindeksan array dalam kode Anda adalah x_n(n). Dan benar saja, baris n=[0:1:N-1] menunjukkan bahwa indeks n bukanlah bilangan positif, karena 0 bukanlah bilangan positif. Pelajaran: MATLAB/Oktaf selalu mengindeks dari 1. Saya menyarankan Anda untuk mengikuti beberapa tutorial karena ini adalah hal mendasar yang perlu Anda ketahui.

person devrobf    schedule 08.03.2013
comment
Dalam pertahanan pengguna @ user2150186, kesalahannya terdengar seolah-olah ada sesuatu yang salah secara mendasar dengan jenis (atau kelas) ekspresi pengindeksan itu sendiri. Pesannya terlalu umum dan berlebihan, mengingat masalahnya adalah satu satu nilai yang salah digunakan sebagai subskrip. Nol bukan indeks yang valid akan menjadi IMO jauh lebih baik. - person user7610; 10.10.2013

Izinkan saya untuk memberikan beberapa kritik terhadap kode Anda - karena Anda mengakui bahwa Anda adalah seorang pemula dalam hal ini. Pertama Anda membuat vektor

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

Yang kebetulan tidak memerlukan tanda kurung siku dan dapat ditulis sebagai

n = 0:N-1;

Kemudian Anda menghasilkan vektor x_n yang, untuk nilai yang diberikan, semuanya akan menjadi nol (sin(pi*n)==0 untuk nilai integer n).

Selanjutnya, Anda melakukan sesuatu yang aneh - Anda tampaknya membuat urutan simbolik, mengulang variabel n yang sangat mirip dengan array n yang Anda tentukan sebelumnya. Tidak yakin apa yang harus dilakukan - sepertinya bukan ide yang bagus. Perhatikan bahwa bahkan @jazzbassrob pun bingung dengan hal ini - fakta bahwa Anda mendapatkan kesalahan "tidak dapat mengindeks dengan nol" bukan karena nilai vektor Anda n, tetapi karena Anda mengulang dari 0..N-1 dalam perintah _seqgen (bukan hal yang sama, meskipun kebetulan nilainya sama).

Dalam ekspresi _seqgen itu, saya melihat exp(k*n/N) yang berfungsi karena dalam konteks ini n adalah variabel yang dilalui 0..N-1 - jika Matlab melihat definisi n sebelumnya, itu akan menimbulkan kesalahan lain karena ketidakcocokan dimensi (karena * adalah matriks operator perkalian dan mengharapkan dimensi kedua dari elemen pertama menjadi = dimensi pertama dari elemen kedua).

Cara yang lebih standar untuk melakukan apa yang Anda coba lakukan adalah

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

Ini melakukan perkalian elemen demi elemen dari suku-suku dalam x_n dan exp dari hasil kali elemen demi elemen dari k dan n dibagi dengan N.

Catatan - apakah ini benar-benar "lebih baik" tergantung pada apa yang ingin Anda lakukan dengan hasilnya (yang di atas mengevaluasinya).

person Floris    schedule 09.03.2013