2015-02-27 3 views
1

У меня есть две матрицы, но с разным размером. Прямо сейчас я делаю сравнение, как это:Матрицы с разным размером по элементам сравнения

ABV = zeros(5,5); 
ABB = zeros(4,1); 
for ii = 1:4 
    test = ABV > ABB(ii) 
end 

Я пытаюсь найти векторизованный метод, который будет делать то же самое, как и мои матрицы не так уж мало. Я пытался использовать BSXFUN, однако он запрашивает одинаковые размерные матрицы.

ответ

2

Вы должны использовать permute там «отправить» элементы ABB к third dimension создающего singleton dimensions в dim-1 и dim-2. Таким образом, конечный результат после применения bsxfun (для однотонного расширения) был бы расширенным 3D array, охватывающим сравнения для каждого элемента 2D-массива ABV по отношению к каждому элементу 1D-массива ABB. Таким образом, сделать что-то вроде этого -

test = bsxfun(@gt,ABV,permute(ABB(:),[3 2 1])) 

Таким образом, каждый 3D срез test будет сравнение всех элементов ABV против одного из элементов в ABB.


Поскольку ABB является 1D массив, вы можете заменить permute с reshape -

test = bsxfun(@gt,ABV,reshape(ABB,1,1,[])) 

Вы можете избежать использования bsxfun в третьем измерении путем преобразования входного 2D массив в 1D массив и это может привести к более эффективному подходу, указанному здесь:

test = reshape(bsxfun(@gt,ABV(:),ABB(:).'),[size(ABV) numel(ABB)]) 
Смежные вопросы