Matlab не может быть установлен в минус, -1

Я хочу заменить определенные значения в матрице / векторе на -1, но не могу этого сделать.

x = [1 5 6; 2 4 3; 3 4 2; 4 2 1];
z = x(:,1) == 4 % get result I want
z =

 0
 0
 0
 1

changem(z,-1,0) % changem doesn't work

ans =

 1
 1
 1
 1

то же самое, если я сделаю массив в changem

changem(z,[-1 1],[0 1])
ans =

 1
 1
 1
 1

Это тоже не работает

 z(1) = -1
 z =

   1
   0
   0
   1

Почему я не могу манипулировать вектором, чтобы получить следующие значения

ans =

 -1
 -1
 -1
 1

Этот подход работает, но ответ на предыдущий вопрос был бы отличным, спасибо.

z = x(:,1) ~= 4; 
z = z * -1; 
z = changem(z,1,0)
ans =

 -1
 -1
 -1
 1

2 ответа

Логическая операция возвращает значения из двоичного набора {0, 1}. если вы хотите, чтобы это было {-1, +1}, одно простое преобразование - умножить на 2, а затем вычесть на единицу.

z = (x(1, :)  == 4)*2 - 1

Я понятия не имею что changeme и поэтому не может комментировать результаты этой функции.

В Matlab и различных средах (например, C, C++) ноль оценивается как логическое ложь, а все, кроме нуля, оценивается как логическое истина. Например, в Matlab, logical(x) преобразует двойной массив x в двоичный / логический массив. logical(-1) оценивается в 1 (т.е. верно). Если z является логическим массивом, и вы делаете назначение:

z(1) = -1;

Что происходит, двойной -1 преобразуется в двоичное значение, которое true (т. е. 1), поскольку все, кроме 0, преобразуется в true 1. Затем 1 присваивается первому индексу z, Все работает как надо.

Другие вопросы по тегам