2015-12-15 2 views
1

С географической сеткой 20х30 размера, у меня есть два (температура) переменные:Нанести 2D порог 3D массива

В данных A с размером 20x30x100
и threshold размером 20х30

Я d хотел бы применить порог к данным, то есть вырезать значения в A, которые превышают threshold, причем каждая точка сетки имеет свой собственный порог. Так как это даст различное количество значений для каждой точки сетки, я подумал, что остальное будет оставлено нулями, так что результирующая переменная, назовем ее B, также будет иметь размер 20x30x100.

Я думал сделать что-то вроде этого, но есть что-то не так с петлей:

B = sort(A,3); %// sort third dimension in ascending order 
threshold_3d = repmat(threshold,1,1,100); %// make threshold into same size as B 

for i=1:20 
    for j=1:30 
     if B(i,j,:) > threshold_3d(i,j,:); %// if B is above threshold 
      B(i,j,:); %// keep values 
     else 
      B(i,j,:) = 0; %// otherwise set to zero 
     end 
    end 
end 

Что такое правильный способ сделать петлю?
Какие еще варианты для этого есть?

Спасибо за помощь!

ответ

2

Вы можете использовать bsxfun для гораздо более эффективного решения, которое будет внутренне заботиться о репликации делаются с repmat, как так -

B = bsxfun(@times,B,bsxfun(@gt,B,threshold)) 

Более эффективным решением может быть использование logical indexing установить False элементы из маски, созданной bsxfun(gt, т.е. True из них с использованием bsxfun(@le в B до нулей, таким образом, избегая использование bsxfun(@times, что для больших многомерных массивов может стать немного дороже , Как так -

B(bsxfun(@le,B,threshold)) = 0 

Note on efficiency : Будучи реляционной операцией происходит с векторизованными операциями с bsxfun обеспечит как память и эффективность выполнения. Здесь обсуждалась часть эффективности памяти - BSXFUN on memory efficiency with relational operations, и здесь были изучены номера производительности - Comparing BSXFUN and REPMAT.

Пример запуска -

>> B 
B(:,:,1) = 
     8  3  9 
     2  8  3 
B(:,:,2) = 
     4  1  8 
     4  5  6 
B(:,:,3) = 
     4  8  5 
     5  6  5 
>> threshold 
threshold = 
     1  3  9 
     1  9  1 
>> B(bsxfun(@le,B,threshold)) = 0 
B(:,:,1) = 
     8  0  0 
     2  0  3 
B(:,:,2) = 
     4  0  0 
     4  0  6 
B(:,:,3) = 
     4  8  0 
     5  0  5 
Смежные вопросы