Если вы строите матрицу output
с нуля, вы должны убедиться, что она еще ни к чему не инициализирована. Для этого вы можете установить пустую матрицу в начале вашего кода:
output = [];
Кроме того, если вы знаете, насколько большим будет output
, ваш код будет работать более эффективно, если вы предварительно выделите массив output
и внесете в индекс индекс для присвоения значений вместо добавления значений к этому. В вашем случае output
должно иметь то же количество строк, что и уникальные значения в массиве ordered1
, поэтому вы можете использовать функцию UNIQUE для предварительного выделения output
:
nRows = numel(unique(ordered1)); %# Get the number of unique values
output = zeros(nRows,2); %# Initialize output
Затем вам потребуется отдельный счетчик (скажем, r
), чтобы отслеживать, какой индекс в output
вы будете добавлять к следующему:
...
output(r,:) = [count/537 tempnum]; %# Overwrite a row in output
r = r+1; %# Increment the row index
...
Несколько дополнительных советов ...
Даже если вы решите полученную ошибку, вы столкнетесь с большим количеством кода, приведенного выше:
Я полагаю, что вы фактически вычисляете функцию плотности вероятности (или PDF) с вашим кодом. Чтобы получить кумулятивную функцию распределения (или CDF), необходимо выполнить кумулятивную сумму по окончательным значениям в первом столбце output
. Вы можете сделать это с помощью функции CUMSUM :
output(:,1) = cumsum(output(:,1));
Ваш цикл выдаст ошибку, когда достигнет последнего элемента ordered1
. Значение k
может стать 538 в вашем внутреннем цикле while, что приведет к возникновению ошибки при попытке доступа к ordered1(k)
в любом месте. Чтобы обойти это, вам нужно будет добавить проверки к значению k
в нескольких точках вашего кода. Одним из таких моментов является ваш внутренний цикл while, который можно переписать так:
while (k <= 537) && (ordered1(k) == tempnum)
count = count + 1;
k = k + 1;
end
В этом решении используется оператор короткого замыкания И &&
, который сначала проверит, является ли (k <= 537)
истинным или ложным. Если оно ложно (т.е. k > 537
), вторая логическая проверка пропускается, поскольку ее результат не имеет значения, и вы избегаете ошибки, которая может возникнуть в результате оценки ordered1(k)
.
Бонус MATLAB прохлада ...
В MATLAB есть много интересных функций, которые могут сделать большую часть работы за вас. Одной из таких функций является ACCUMARRAY . Ваша TA может захотеть, чтобы вы делали что-то, используя циклы, как вы делали выше, но вы можете сократить весь код до нескольких строк, например:
nValues = numel(ordered1); %# Get the number of values
p = accumarray(ordered1,ones(size(ordered1)))./nValues; %# Create a PDF
output = [cumsum(p) unique(ordered1)]; %# Create the CDF output