2009-11-21 1 views
4

У меня есть две маски, которые я хотел бы объединить вместе, переписывая mask1 с mask2, если mask2 не имеет нуля. Маски не являются бинарными, они представляют собой некоторое значение, которое определяется пользователем в интересующей области и 0 в другом месте.Как объединить две маски в MATLAB?

Например, если:

mask1=[0 5 5;0 5 5]; 
mask2=[4 4 0;4 4 0]; 

, то я хотел бы выход [4 4 5;4 4 5]. И если бы я тогда была еще одна маска,

mask3=[0 6 0;0 6 0]; 

, то я хотел бы выход [4 6 5;4 6 5]

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

ответ

5

испытано быстро

mask2+mask1.*(mask2==0) 

для первого выхода, я оставляю вам обобщение решения

2
mask1=[0 5 5;0 5 5]; 
mask2=[4 4 0;4 4 0]; 

idx = find(mask2==0); %# find zero elements in mask2 
mask2(idx) = mask1(idx) %# replace them with corresponding mask1 elmenets 

mask3=[0 6 0;0 6 0]; 
idx = find(mask3==0); %# find zero elements in mask3 
mask3(idx) = mask2(idx) %# replace them with corresponding mask2 elmenets 
+0

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

+0

True. @gnovice добавил, что я сохранил это в качестве альтернативного решения. – Amro

4

Другой вариант заключается в использовании logical indexing:

%# Define masks: 

mask1 = [0 5 5; 0 5 5]; 
mask2 = [4 4 0; 4 4 0]; 
mask3 = [0 6 0; 0 6 0]; 

%# Merge masks: 

newMask = mask1;    %# Start with mask1 
index = (mask2 ~= 0);   %# Logical index: ones where mask2 is nonzero 
newMask(index) = mask2(index); %# Overwrite with nonzero values of mask2 
index = (mask3 ~= 0);   %# Logical index: ones where mask3 is nonzero 
newMask(index) = mask3(index); %# Overwrite with nonzero values of mask3 
+1

«% #» - это прагма в Matlab. Я получаю предупреждения «Непризнанный компилятор pragma». –

+0

@Andrew: '%' создает комментарий, поэтому ничто после его не должно оцениваться вообще. '#' Просто для того, чтобы раскрасить комментарии на SO выглядели лучше. – gnovice

+1

@ Андрю: Я не знал этого .. Видимо, есть несколько прагм: http://blogs.mathworks.com/desktop/2008/09/22/matlab-pragmas/ – Amro

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