MATLAB устанавливает значения матрицы в массиве - PullRequest
1 голос
/ 03 мая 2010

Я пытаюсь написать код для вычисления интегральной функции распределения в Matlab. Когда я пытаюсь поместить мои результаты в массив, он кричит на меня.

tempnum = ordered1(1);
k=2;
while(k<538)
    count = 1;
    while(ordered1(k)==tempnum)
        count = count + 1;
        k = k + 1;
    end
    if(ordered1(k)~=tempnum)
        output = [output;[(count/537),tempnum]];
        k = k + 1;
        tempnum = ordered1(k);
    end
end

Ошибки, которые я получаю, выглядят так

??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Error in ==> lab8 at 1164
        output = [output;[(count/537),tempnum]];

Строка для добавления к выходной матрице была дана мне моим ТА. Он не учил нас синтаксису в течение года, поэтому я не совсем уверен, что делаю неправильно. Любая помощь с благодарностью.

1 Ответ

2 голосов
/ 03 мая 2010

Если вы строите матрицу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...