我正在尝试编写一些代码来计算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]];
我的TA给了我添加到输出矩阵的行。他整年都没有教我们太多的语法,所以我不确定我做错了什么。非常感谢任何帮助。
答案 0 :(得分:2)
如果您从头开始构建矩阵output
,则应确保它尚未初始化为任何内容。为此,您可以在代码的开头将其设置为空矩阵:
output = [];
此外,如果你知道output
有多大,your code will run more efficiently if you preallocate the array output
并在数组中索引以分配值而不是为其附加值。在您的情况下,output
应该具有与数组ordered1
中的唯一值相同的行数,因此您可以使用函数UNIQUE来预分配output
:< / p>
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
...
即使您解决了错误,您也会遇到上述代码:
我相信您实际上正在使用您的代码计算probability density function(或PDF)。为了获得cumulative distribution function(或CDF),您必须对output
的第一列中的最终值执行累积总和。您可以使用函数CUMSUM执行此操作:
output(:,1) = cumsum(output(:,1));
当你的循环到达ordered1
的最后一个元素时,它会抛出一个错误。 k
的值在内部while循环中可能变为538,这会在您尝试在任何地方访问ordered1(k)
时导致错误。要解决此问题,您必须在代码中的多个点添加k
值的检查。其中一个问题就是你的内部while循环,它可以改写为:
while (k <= 537) && (ordered1(k) == tempnum)
count = count + 1;
k = k + 1;
end
此解决方案使用short-circuit AND operator &&
,它将首先检查(k <= 537)
是真还是假。如果它为假(即k > 537
),则跳过第二次逻辑检查,因为其结果无关紧要,并且您可以避免因评估ordered1(k)
而导致的错误。
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