2010-03-19 4 views
4

У меня есть цикл, который перебирает один массив ...Построение массива в то время как цикл

for i=1:length(myArray) 

В этом цикле я хочу проверить на стоимость туАггау и добавить его в другой массив myArray2 если он соответствует определенным условиям. Я просмотрел документы MATLAB, но ничего не мог найти при создании массивов без объявления всех их значений при инициализации или чтения данных в них одним выстрелом.

Большое спасибо!

+0

Вы, вероятно, найдете следующие ссылки, представляющие интерес: http://stackoverflow.com/questions/1680557/optimizing -экстракция-из-данных-из-матрицы-матрицы, http://stackoverflow.com/questions/132092/what-are-your-favourite-matlab-octave-programming-tricks, http://stackoverflow.com/questions/1450322/matlab-excluding-data-outside-1-standard-deviation, http://stackoverflow.com/questions/2202641/how-do-compare-all-elements-of-two-arrays-in -matlab – mtrw

+1

Позвольте мне добавить это к списку: http://stackoverflow.com/questions/1548116/matrix-of-unknown-length-in-matlab – Amro

ответ

7

Я предполагаю, что вы хотите что-то более сложное, чем

myArray = [1 2 3 4 5]; 
myArray2 = myArray(myArray > 3); 

Самый простой (но самый медленный) способ сделать то, что вы просите что-то вроде

myArray2 = []; 
for x = myArray 
    if CheckCondition(x) == 1 
     myArray2 = [myArray2 x]; %# grows myArray2, which is slow 
    end; 
end; 

Вы можете сортировать оптимизировать это с чем-то вроде

myArray2 = NaN(size(myArray)); 
ctr = 0; 
for x = myArray 
    if CheckCondition(x) == 1 
     ctr = ctr + 1; 
     myArray2(ctr) = xx; 
    end; 
end; 
myArray2 = myArray2(1:ctr); %# drop the NaNs 

Вы также можете посмотреть в ARRAYFUN.

+0

Почему у вас есть u sed NaNs, могу ли я использовать нули или единицы? – dexterdev

+0

@dexterdev вы можете, да. – mtrw

2

По большей части способ сделать то, что вы описываете, аналогичен mtrw, указанному в первом примере.

Скажем, data = [1 2 3 4 5 6 7 8 9 10], и вы хотите получить только четные числа.

select = mod(data,2)==0; % This will give a binary mask as [0 1 0 1 0 1 0 1 0 1]. 

Если вы data2=data(select), это даст вам [2 4 6 8 10].

Конечно, тем короче способ сделать это, как mrtw было в примере 1:

data2=data(some_criteria); 
+0

Просто небольшая прецессия. Кажется, маска должна быть массивом логических. Я тестировал с помощью select = [0 1 0 1 ...] и получил ошибку «Индексы индексов должны быть либо реальными целыми положительными, либо логическими». Затем я попытался с select = [false true false true ...], и он работал, как ожидалось. –

Смежные вопросы