Создание массива во время цикла - PullRequest
4 голосов
/ 20 марта 2010

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

for i=1:length(myArray)

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

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

Ответы [ 2 ]

7 голосов
/ 20 марта 2010

Полагаю, вы хотите что-то более сложное, чем

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 .

2 голосов
/ 22 марта 2010

По большей части способ сделать то, что вы описываете, похож на 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...