ошибка октавы: индексы нижнего индекса должны быть либо положительными целыми числами, либо логическими

Я пытаюсь суммировать произведение индексированного вектора и индексированной матрицы следующим образом:

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

Я все еще получаю ту же ошибку, хотя...


person Cesar    schedule 08.03.2013    source источник
comment
Я забыл упомянуть, что я только начинаю использовать matlab/octave. Я искал в Интернете разные способы сделать это, но я просто в тупике.   -  person Cesar    schedule 09.03.2013


Ответы (2)


Сообщение об ошибке объясняет, что не так: вы пытаетесь проиндексировать массив с числом, которое не является положительным целым числом или логическим. Единственная индексация массива в вашем коде — x_n(n). И действительно, строка n=[0:1:N-1] демонстрирует, что индекс n не положительный, поскольку 0 не является положительным числом. Урок: MATLAB/Octave всегда индексируется с 1. Я предлагаю вам несколько руководств, так как это фундаментальные вещи, которые вам необходимо знать.

person devrobf    schedule 08.03.2013
comment
В защите пользователей @user2150186 ошибка звучит так, как будто что-то принципиально неправильное с типом (или классом) выражения индексации само по себе. Сообщение слишком напыщенно общее, учитывая, что проблема заключается в одном единственном неверном значении, используемом в качестве нижнего индекса. Ноль не является допустимым индексом, по ИМО было бы намного лучше. - person user7610; 10.10.2013

Позвольте мне немного покритиковать ваш код, поскольку вы признали, что были новичком в этом. Сначала вы создаете вектор

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

Который, кстати, не нуждается в квадратных скобках и может быть записан как

n = 0:N-1;

Затем вы генерируете вектор x_n, который для заданных значений будет состоять из нулей (sin(pi*n)==0 для целочисленных значений n).

Затем вы делаете что-то странное — кажется, вы генерируете символьную последовательность, зацикливая переменную n, которая очень похожа на массив n, который вы определили ранее. Не уверен, что с этим делать - не похоже на отличную идею. Обратите внимание, что даже @jazzbassrob был смущен этим — тот факт, что вы получили ошибку «невозможно индексировать с нулем», был не из-за значения вашего вектора n, а из-за того, что вы зацикливались с 0..N-1 в команде _seqgen (не то же самое, хотя это и те же значения).

В этом выражении _seqgen я вижу exp(k*n/N), которое работает, потому что в этом контексте n — это переменная, которая проходит через 0..N-1 — если бы Matlab смотрел на более раннее определение n, он выдал бы другую ошибку из-за несоответствия размеров (поскольку * — это матрица оператор умножения и ожидает, что второе измерение первого элемента будет равно первому измерению второго элемента).

Более стандартным способом сделать то, что вы пытаетесь сделать, было бы

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

Это выполняет поэлементное умножение членов в x_n и exp поэлементного произведения k и n, деленного на N.

Примечание. Является ли это на самом деле «лучше», зависит от того, что вы хотите сделать с результатом (это оценивается выше).

person Floris    schedule 09.03.2013