Неизменные стили Silverlight и отсутствие слияния словаря являются также большим - если Вы пишете средства управления, эти два дают Вам много стычки - не говоря уже о неуправляемо больших generic.xaml файлах.
MATLAB использует динамическую типизацию с автоматическим управлением памятью. Это означает, что вам не нужно объявлять матрицу фиксированного размера перед ее использованием - вы можете изменять ее по мере продвижения, и MATLAB будет динамически выделять вам память.
НО это способ более эффективно сначала выделять память для матрицы, а затем используют ее. Но если вашим программам нужна такая гибкость, дерзайте.
Я полагаю, вам нужно продолжать добавлять строки в свою матрицу. Следующий код должен работать.
Matrix = [];
while size(Matrix,1) <= 10
Matrix = [Matrix;rand(1,2)];
end
disp(Matrix);
Здесь мы динамически перераспределяем пространство, необходимое для Матрицы
, каждый раз, когда вы добавляете новую строку. Если вы заранее знаете, например, верхнюю границу количества строк, которые у вас будут, вы можете объявить Matrix = zeros (20,
Еще одна разновидность того же самого, что опубликовал Джейкоб.
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
Another approach that has performance in mind while still trying to be space-efficient, is to preallocate memory in large batches, adding more batches as needed. This is well suited if you have to add a large number of items without knowing how many beforehand.
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
EDIT: As a time comparison, consider the following cases:
list = zeros(50000,2); list(k,:) = [x y];
list = []; list(k,:) = [x y];
On my machine, the results were:
1) Elapsed time is 0.080214 seconds.
2) Elapsed time is 0.065513 seconds.
3) Elapsed time is 24.433315 seconds.
Following discussions in the comments, I've rerun some tests using the latest R2014b release. The conclusion is that recent versions of MATLAB has greatly improved the performance of automatic array growth!
However there is a catch; the array must be growing across the last dimension (columns in the case of 2D matrices). That's why appending rows like originally intended is still too slow without preallocation. This is where the above proposed solution can really help (by extending the array in batches).
See here for the full set of tests: 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,:) = [];