我试图设置一个零矩阵可变长度的具有两列进我可以输出一个while循环(用它来存储从欧拉方法具有调整时间步长分步数据的意图)的结果。 长度将由循环的迭代数目来确定。
我不知道是否有一种方法,我可以做到这一点,而我跑的循环或我是否需要将其设置为开始,以及如何去这样做。
我试图设置一个零矩阵可变长度的具有两列进我可以输出一个while循环(用它来存储从欧拉方法具有调整时间步长分步数据的意图)的结果。 长度将由循环的迭代数目来确定。
我不知道是否有一种方法,我可以做到这一点,而我跑的循环或我是否需要将其设置为开始,以及如何去这样做。
如果列数是固定的,你可以随时添加行到您的矩阵(环内)
如
while (....)
.....
new_row =[x y] ; % new row with values x & y
mat = [mat ; new_row];
当然,如果你的while循环知道之前的迭代次数是更有效的预分配矩阵
考虑到这一点了性能的同时,仍试图以节省空间的另一种方法,是在大批量的预分配内存,根据需要添加更多的批次 。 如果你要添加大量的项目不知道有多少事前这是非常适合。
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
编辑 :由于时间比较,考虑以下情况:
list = zeros(50000,2); list(k,:) = [xy];
list = zeros(50000,2); list(k,:) = [xy];
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
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,:) = [];
的雅各张贴同样的事情的另一种味道。
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