MATLAB中未知长度的matrix?

我试图build立一个两列可变长度的零matrix,我可以输出一个while循环的结果(打算用它来存储从调整时间步骤的欧拉方法的步骤数据)。 长度将由循环的迭代次数决定。

我想知道是否有一种方法可以在运行循环时执行此操作,或者是否需要将其设置为开始,以及如何执行此操作。

如果列的数量是固定的,你总是可以添加行到你的matrix(在循环内)

例如

while (....) ..... new_row =[xy] ; % new row with values x & y mat = [mat ; new_row]; 

当然,如果您知道while循环之前的迭代次数,预分配matrix的效率会更高

另一种考虑性能的方法仍然是空间有效的,就是预先分配大批量的内存,根据需要添加更多批次 。 如果您不得不事先知道多less项目,则必须添加大量项目,这非常合适。

 BLOCK_SIZE = 2000; % initial capacity (& increment size) listSize = BLOCK_SIZE; % current list capacity list = zeros(listSize, 2); % actual list listPtr = 1; % pointer to last free position while rand<1-1e-5 % (around 1e5 iterations on avrg) % push items on list list(listPtr,:) = [rand rand]; % store new item listPtr = listPtr + 1; % increment position pointer % add new block of memory if needed if( listPtr+(BLOCK_SIZE/10) > listSize ) % less than 10%*BLOCK_SIZE free slots listSize = listSize + BLOCK_SIZE; % add new BLOCK_SIZE slots list(listPtr+1:listSize,:) = 0; end end list(listPtr:end,:) = []; % remove unused slots 

编辑 :作为时间比较,请考虑以下情况:

  1. 与上面50000次迭代相同的代码。
  2. 预先分配整个matrix: list = zeros(50000,2); list(k,:) = [xy]; list = zeros(50000,2); list(k,:) = [xy];
  3. dynamic添加vector到matrix: list = []; list(k,:) = [xy]; list = []; list(k,:) = [xy];

在我的机器上,结果是:

1)运行时间为0.080214秒
2)已用时间为0.065513秒。
3)经过的时间是24.433315秒。


更新:

在评论讨论之后,我使用最新的R2014b版本重新运行了一些testing。 结论是最近的MATLAB版本大大提高了自动arrays增长的性能!

但有一个问题。 该数组必须在最后一个维度上生长(在2Dmatrix的情况下为列)。 这就是为什么在不预先分配的情况下,像最初打算的那样添加行仍然太慢。 这是上面提出的解决scheme真正可以帮助的地方(通过批量扩展数组)。

看到这里的全套testing: https : //gist.github.com/amroamroamro/0f104986796f2e0aa618

MATLAB使用dynamictypes和自动内存pipe理。 这意味着,在使用之前,您不需要声明一个固定大小的matrix – 您可以随时更改它,MATLAB将为您dynamic分配内存。

但是先为matrix分配内存然后再使用它会更有效率。 但是如果你的程序需要这种灵活性,那就去做吧。

我猜你需要不断追加行到你的matrix。 下面的代码应该工作。

 Matrix = []; while size(Matrix,1) <= 10 Matrix = [Matrix;rand(1,2)]; end disp(Matrix); 

在这里,我们在每次添加新行时dynamic地重新分配Matrix所需的空间。 如果事先知道,比如你将要拥有的行数的上限,你可以声明Matrix = zeros(20,2) ,然后将每一行增量插入到matrix中。

 % Allocate space using the upper bound of rows (20) Matrix = zeros(20,2); k = 1; for k = 1:10 Matrix(k,:) = rand(1,2); end % Remove the rest of the dummy rows Matrix(k+1:end,:) = []; 

Jacob发布的另一个同样的东西。

 for counter = 1:10 Matrix(counter,:) = rand(1,2); end disp(Matrix); 

一个“好”的事情是你可以猜测一个最小尺寸来帮助表演。

这也许是有趣的: http : //www.mathworks.com/help/matlab/math/resizing-and-reshaping-matrices.html#f1-88760