2013-10-24 1 views
0

У меня есть два вектора А и В.Matlab: Создание нового вектора после сравнения двух векторов

A = [-1; 2; 4; 2; 4]; 
B = [1; 2; 14; 0; -4]; 

Я хочу сделать поэлементное СРАВНЕНИЕ выше двух векторов и получить третий вектор:

C =[1; 0; 1; -1; -1]; 

т.е.

C(i) = -1 if B(i) < A(i) 
C(i) = +1 if B(i) > A(i) 
C(i) = 0 if B(i) = A(i) 

Мое решение:

C = A - B; 
C(C>0) = 1; 
C(C<0) = -1 
C(C==0) = 0; 

Любой лучший метод оценивается.

ответ

2

Используйте функцию sign

C = sign(B - A) 

Результат

C = 

    1 
    0 
    1 
    -1 
    -1 
+0

К сожалению, извинения за изменение - Я следовал за кодом в конце вопроса, а не по спецификациям ранее. –

1

Я нашел, что это полезно для определения функции vif (векторизованную если) в качестве

function res = vif(test, a, b) 

    res = zeros(size(test)); 

    if isscalar(a); a = repmat(a, size(test)); end 
    if isscalar(b); b = repmat(b, size(test)); end 

    res(test) = a(test); 
    res(~test) = b(~test); 

end 

Вы бы тогда быть в состоянии написать

>> C = vif(A>B, 1, vif(A<B, -1, 0)); 

Вложенные вызовы на vif работу как вложенной if заявление, или последовательность if и elseif заявлений, а-ля

if A > B 
    C = 1; 
else 
    if A < B 
    C = -1; 
    else 
    C = 0; 
    end 
end 

или

if A > B 
    C = 1; 
elseif A < B 
    C = -1; 
else 
    C = 0; 
end 

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

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