2012-06-09 2 views
0

Я пытаюсь построить массив, присоединяя отдельные столбцы к этому массиву в цикле for. Я делаю это, сначала инициализируя столбец нулей и помещая каждый новый столбец, который я читаю в правой части обновленного вектора. Но, к сожалению, это работает частично и только после ограничения, т. Е. Сохраняя только первое - например, 500 строк каждого нового вектора.Вставить столбцы массива итеративно в MATLAB

Что касается следующего решения проблемы, в первую очередь, я не понимаю, почему этот нулевой вектор-столбец не отображается в последнем массиве! Другая проблема заключается в том, что даже если я знаю общее количество столбцов конечного массива с самого начала, в некоторых случаях я не знаю фактического количества строк отдельных столбцов. На самом деле, я хочу рассмотреть, как число строк по умолчанию в моем конечном массиве, большее количество строк между отдельными отдельными столбцами, которые следует присоединить, поэтому я предполагаю, что наилучшей практикой должно быть выполнение всего количества столбцов решая о большем количестве строк, затем настраиваем соответствующее измерение начального массива, которое должно быть заполнено данными о единичных столбцах, и, наконец, для заполнения первого на основе последних.

Любое предложение будет высоко оценено!

data = zeros(500,1); 
for symbol = 1:length(symbol_list), 
    [hist_data] = retrieve_data(symbol_list(symbol)); 
    data = [data hist_data(1:500)]; 
end 

EDIT:

Позвольте мне дать вам ввода/вывода, например:

Я хочу, чтобы поместить следующие три столбца (я получить один из них в каждой итерации)

0.402513860949959 0.401546899405730 0.405949059210334 
0.401396441661866 0.400288848738267 0.403936753893693 
0.400862023741474 0.402233108860710 0.404473368644797 
0.411161714570851 0.413612748989126 0.409437055092511 
0     0.414870799656589 0.415071509979105 
0     0.416586323294039 0 

один рядом с другим, заканчивая следующей таблицей (сохраняйте только те, у кого больше, но одинаковое количество строк - таким образом, здесь я сохраняю только вторую колонку):

0.401546899405730 
0.400288848738267 
0.402233108860710 
0.413612748989126 
0.414870799656589 
0.416586323294039 

Другими словами, у меня очень большое количество столбцов, которые я хочу прикрепить друг к другу. Большинство из них имеют очень большую длину строк, что и то же самое. Однако некоторые другие имеют произвольное меньшее число (длину) строк. Что я должен найти это «большое» количество строк, сохраните только столбцы, соответствующие этой «большой» длине, и, наконец, поместите один рядом друг с другом.

+0

Любые предложения? – user706838

ответ

2

Я думаю, вам может быть лучше использовать массив ячеек для хранения данных, полученных из retrieve_data, поскольку вы обрабатываете столбцы с различным количеством строк. Собрав все в массиве ячеек, вы все равно можете преобразовать их в стандартную матрицу, заполнив более короткие строки или обрезая более длинные.

c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'} 
sizesC = cellfun(@length,c) 
% pad to maximal size with Nan's 
for el=1:length(c) 
    c{el}(sizesC(el)+1:max(sizesC))=NaN; 
end 
% Trim to minimal size 
c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'} 
for el=1:length(c) 
    c{el}(min(sizesC)+1:end)=[]; 
end 
% Convert rectangular cellarray to matrix 
m=cell2mat(c) 
1

Я не уверен, что я следовал большую часть вашего вопроса, так что это не может быть ответом на вопрос, который Вы задали ...

Если структура данных вы пытаетесь построить не очень массив, например, если он действительно представляет собой список векторов неравных длин, то простой старый массив может быть не лучшей структурой данных, используемой в Matlab. Это может быть практический выбор, но лучше выбрать вариант cell array.

Если массив является правильным или практичным выбором, его создание путем добавления нового столбца при каждом обходе цикла обычно считается большинством опытных пользователей Matlab как ОЧЕНЬ ПЛОХАЯ ИДЕЯ. Создание массивов таким образом может быть очень дорого во времени и может также вызвать проблемы с памятью. В общем, это общее мнение, никто не заставит вас следовать этой мысли.

Гораздо лучший подход состоит в том, чтобы выделить ваш массив в больших кусках. В идеале (?) Ситуации вы бы выделить весь массив на одном дыхании, с утверждением, такие как

data = zeros(500,462); 

, а затем записать данные в каждом столбце внутри вашего цикла. Если вы не знаете количество столбцов, которые вы в конце концов захотите, тогда создайте массив, который, вероятно, будет достаточно большим; если у вас заканчивается комната, добавьте N столбцов за один раз, продолжайте цикл. При необходимости повторите. Хороший выбор N сильно зависит от вашей проблемы и ваших данных.

причиной того, что здание (больших) массивов столбец за столбцом (или строка за строкой) является то, что всякий раз, когда вы добавляете новый столбец Matlab:

  1. Хватает достаточно свободной памяти для нового, больше , массив;
  2. копирует значения из старых мест памяти в новые;
  3. возвращает блок памяти, где старая версия массива была сохранена в свободной памяти пула (или что-то Matlab фактически называет его)

Doing этот раз может занять много времени. Это может также вызвать чрезмерную фрагментацию памяти, ни один из блоков памяти, возвращенных в пул, не будет достаточно большим, чтобы использоваться для более поздней версии того же массива; неверно использовать свой образ памяти, и в итоге вы получите память, занятую освобожденными блоками, слишком малыми для любых новых массивов, но по сравнению с тем, что вам нужно для нечетного скаляра здесь и там. Это скорее вероятность, чем определенность, но стоит иметь в виду, когда перебирая данные в каждый байт в поле.