在MATLAB未知长度的矩阵?(Matrix of unknown length in MATLAB

2019-07-21 21:08发布

我试图设置一个零矩阵可变长度的具有两列进我可以输出一个while循环(用它来存储从欧拉方法具有调整时间步长分步数据的意图)的结果。 长度将由循环的迭代数目来确定。

我不知道是否有一种方法,我可以做到这一点,而我跑的循环或我是否需要将其设置为开始,以及如何去这样做。

Answer 1:

如果列数是固定的,你可以随时添加行到您的矩阵(环内)

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

当然,如果你的while循环知道之前的迭代次数是更有效的预分配矩阵



Answer 2:

考虑到这一点了性能的同时,仍试图以节省空间的另一种方法,是在大批量的预分配内存,根据需要添加更多的批次 。 如果你要添加大量的项目不知道有多少事前这是非常适合。

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. 事先预分配整个矩阵: list = zeros(50000,2); list(k,:) = [xy]; list = zeros(50000,2); list(k,:) = [xy];
  3. 动态地添加向量的矩阵: list = []; list(k,:) = [xy]; list = []; list(k,:) = [xy];

在我的机器,结果是:

1)所用时间是0.080214秒
2)所用时间是0.065513秒。
3)经过时间24.433315秒。


更新:

继在评论中讨论,我已经重新运行使用最新版本R2014b一些测试。 得出的结论是,近期MATLAB的版本有很大的提升自动排列的业绩增长!

但是有一个陷阱; 所述阵列必须通过最后一维越来越大(列在二维矩阵的情况下)。 这就是为什么像原本打算追加行仍没有预分配太慢。 这是上述提出的解决方案可以真正帮助(通过延伸分批数组)。

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



Answer 3:

MATLAB使用带有自动内存管理动态类型。 这意味着,你不需要使用它之前要声明固定大小的矩阵 - 当您去和MATLAB会为您动态分配内存,你可以改变它。

的方式更有效地对矩阵进行第一分配存储器, 然后使用它。 但是,如果你的程序需要这种灵活性,去了。

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

Matrix = [];

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

disp(Matrix);

在这里,我们要动态再分配需要的空间Matrix每次添加一个新行时间。 如果你事先知道,说,你就要有行数的上限,你可以声明Matrix = zeros(20,2)然后插入每一行到矩阵递增。

% 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,:) = [];


Answer 4:

的雅各张贴同样的事情的另一种味道。

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



文章来源: Matrix of unknown length in MATLAB?