2015-08-05 1 views
2

В Matlab, у меня есть две матрицы: одна с целыми числами, x, и один с Булев, y:Matlab: Используя матрицу в качестве маски для выполнения поэлементно операций

x = 

    2  4  2 
    3  3  1 
    4  1  5 

y = 

    0  0  1 
    1  1  0 
    1  0  1 

Что я теперь хочу сделать назначить некоторые элементы x на 5, и я хочу использовать y в качестве маски для определения того, какие элементы должны быть установлены на 5. Таким образом, элементы с соответствующим значением 0 в y должны оставаться такими, какими они находятся в x, но те, у кого есть соответствующее значение 1 в y должно быть установлено равным 5. Следовательно, выход должен быть:

 2  4  5 
    5  5  1 
    5  1  5 

Я попытался следующие:

x(y) = 5 

Что дает мне ошибку:

Subscript indices must either be real positive integers or logicals. 

И я также пытался:

y(x) = 5 

Который дает мне следующее :

5  5  1 
5  1  0 
5  0  1 

Может кто-нибудь объяснить, что здесь происходит, и что мне нужно сделать, чтобы получить желаемый результат?

ответ

3

Ошибка у вас связано с тем, что, по-видимому, y имеет type double время, в этом случае, он должен быть type logical

Вы можете попробовать:

x(logical(y))=5 

Надежда это помогает

+0

Еще короче: 'x (y == 1) = 5;' – rayryeng

+1

@rayryeng - ваше предложение слишком длинное. 'x (~~ y) = 5;';) –

+0

@ Dev-iL - Ищет четкость. Не игра в гольф. – rayryeng

-1

x(find(y)) = 5; должно работать нормально.

+0

'find' перебор в этом случае. Использование логической индексации лучше подходит ... т. Е. 'X (y == 1) = 5;'. – rayryeng

0

Сва не фантазиям решения, но будет решить вашу проблему

>> x = [ 2  4  2;3  3  1;4  1  5]; 
y = logical([ 0  0  1;1  1  0;1  0  1]); 
f = x(:); 
f(y(:)) = 5; 
x = reshape(f,size(x)) 

x = 

    2  4  5 
    5  5  1 
    5  1  5 

>> 
+0

Это не работает. 'y' все еще является' double' массивом с значения 0, и вы должны получить ошибку во втором выражении. Вы можете только нарезать массивы с использованием числовых массивов, индексированных начиная с 1, или являются «логическими» массивами. – rayryeng

+0

попытаться скопировать и вставить код –

+0

Теперь, когда вы добавили «логический» он работает. У вас не было это раньше. Удаление вниз. Вероятно, вы должны дважды проверить свои ответы перед публикацией. – rayryeng

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