MATLAB设置数组中的矩阵值

时间:2010-05-03 05:33:14

标签: matlab matrix

我正在尝试编写一些代码来计算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给了我添加到输出矩阵的行。他整年都没有教我们太多的语法,所以我不确定我做错了什么。非常感谢任何帮助。

1 个答案:

答案 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)而导致的错误。

Bonus MATLAB coolness ...

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