我想要设置一个具有两列的零矩阵,长度可变,可以将while循环的结果输出到其中(以存储调整时间步长的欧拉方法的步骤数据)。长度将由循环的迭代次数确定。
我想知道是否有一种方法可以在运行循环时完成此操作,还是需要先进行设置,如何进行。
我想要设置一个具有两列的零矩阵,长度可变,可以将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,:) = [x y];
list = []; list(k,:) = [x y];
在我的机器上,结果如下:
1) 经过0.080214秒的时间。
2) 经过0.065513秒的时间。
3) 经过24.433315秒的时间。
根据评论中的讨论,我使用最新的R2014b版本重新运行了一些测试。结论是,MATLAB的最近版本极大地提高了自动数组增长的性能!
然而有一个问题; 数组必须沿着最后一个维度(在2D矩阵的情况下是列)增长。这就是为什么像最初想象的那样附加行仍然太慢而需要预先分配的原因。这就是上面提出的解决方案可以真正帮助的地方(通过批量扩展数组)。
请参见此处以获取完整的测试集:https://gist.github.com/amroamroamro/0f104986796f2e0aa618
while (....)
.....
new_row =[x y] ; % new row with values x & y
mat = [mat ; new_row];
当然,如果您在进入while循环之前知道迭代的次数,预先分配矩阵会更有效率。
mat(end+1,:) = new_row;
- nhoweMatrix = [];
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);