2017-01-19 2 views
0

У меня есть 3 огромных массива: Array1, Array2 и Array3. Все они имеют одинаковые размеры, а их размер - 7000000x1.FInding индексы нескольких массивов, удовлетворяющих условию в matlab

Я пытаюсь найти индексы массивов, которые удовлетворяют общее условие, используя find команду в Matlab, я использовал как этот

I2 = find (Array1 > a1 & Array1 < a2 & ... 
      Array2 > b1 & Array2 < b2 & ... 
      Array3 > c1 & Array3 < c2); 

а, Ь и с содержат скалярные значения.

I2 находится внутри цикла (~ 7M итераций), и эта операция занимает огромное количество времени! Любые предложения по улучшению этой строки кода?

+0

Это более чем вероятно, так быстро, как это будет. Есть ли какая-то особая причина, по которой вам нужно «найти», а не просто получить логический массив? – Suever

+0

Я думал, что найти это простой способ сделать это. Не могли бы вы объяснить, что имеется в виду, выбирая логический массив? – Mechanician

+1

Хорошо, что вы делаете позже с 'I2'? Используете ли вы его, чтобы извлекать ценности из чего-то другого? Если это так, вы можете опустить 'find' и просто использовать логический массив, возвращаемый остальной частью инструкции, для индексации для вас – Suever

ответ

0

Это, вероятно, быстрее, используя логическую индексацию не find

% Set up array of indices 
I = 1:numel(Array1); 

% Logical indexing the same as your Find function 
I2 = I2(Array1 > a1 & Array1 < a2 & ... 
     Array2 > b1 & Array2 < b2 & ... 
     Array3 > c1 & Array3 < c3); 

I2 теперь содержит индексы, соответствующие указанным критериям.

Вы сказали, что вы будете использовать это как

Array5 = Array4(I2) 

Если это единственное применение, вы можете пропустить I2 создание полностью и использовать ту же логическую индексацию, используемый для его создания, как и

Array5 = Array4(Array1 > a1 & Array1 < a2 & ... 
       Array2 > b1 & Array2 < b2 & ... 
       Array3 > c1 & Array3 < c3); 
Смежные вопросы