2014-10-02 3 views
1

Я пытаюсь вычесть каждый элемент из другого элемента в векторе в matlab. Я знаю, что diff (X) дает разность элементов. ПустьВычитание каждого элемента из другого элемента в столбце В Matlab?

x = {1 
    3 
    3 
    6 
    8 
    10 
    15 
    23} 

DiffX = diff (x); 

приведет

DiffX = {2 
     0 
     3 
     2 
     2 
     5 
     8} 

Однако то, что я ищу это различие каждого элемента из каждого элемента что-то вроде этого

DiffX = {0 
     2 
     2 
     5 
     7 
     9 
     14 
     22 
     -2 
     0 
     0 
     3 
     5 
     7 
     12 
     20 
     . 
     . 
     . 
     . 
     . 
     0} 

Который приходит от

DiffX = {x(1) - x(1), x(2) - x(1), x(3) - (1), x(4) - x(1), ... , x(8) - x(1), x(1) - x(2), x(2) - x(2), x(3) - x(2), ......., x(8) - x(8)} 

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

Большое спасибо

+1

Почему '' массив ячеек?По какой-либо причине это не может быть 'x = [1 3 3 6 8 10 15 23]'? – Dan

+0

Только что заметил, что я поставил x как ячейку, которая была ошибкой. Извинения за путаницу. – Matlaber

ответ

3

Это может быть сделано с bsxfun(@plus, x,-x'). Это добавляет поэтапную двоичную операцию + к массивам x и -x '(отрицательный x транспонирован).


В (было) указано в комментарии, то же самое может быть достигнуто за счет bsxfun(@minus, x, x').


Если результат должен быть вектор, вы должны изменить его на reshape(bsxfun(@minus, x', x),[],1). См. Также комментарий Роберта Р ниже.

Кстати, синтаксис в вашем вопросе немного запутан. Как было сказано ранее, { и } подразумевают, что результатом является массив ячеек, а применение diff указывает на нормальный массив. Кроме того, обозначение для присвоения значений x предполагает нормальный векторный результат, но отсутствие ; подразумевает, что результатом будет вектор-строка. Во всяком случае, играйте с символами транспонирования, и должен появиться желаемый результат.

+0

Помните, что 'x' - это массив ячеек. Это не работает на клеточных массивах. – kkuilla

+1

Ну, выполнение 'diff' также не работает и с ячейками. Сделать его работу для ячеек можно с помощью 'cell2mat (x)'. – MeMyselfAndI

+0

+1, но я думаю, что это должно быть 'bsxfun (@plus, -x, x ')', чтобы получить знаки правильные. @Matlaber: если вы хотите, чтобы это был один вектор-столбец, вы можете сделать: 'reshape (bsxfun (@plus, -x, x '), [], 1)' или 'res = res (:)' где 'res' является результатом' bsxfun'. –

0

bsxfun это лучший способ пойти, но это, как вы это сделать с помощью петель (не делать это таким образом, это только для иллюстрации концепции петель):

я предлагаю, что вы храните результат в виде матрицы 2D, и в этом случае решение петля проста:

x = {1 3 3 6 8 10 15 23} 

D = zeros(numel(x)); %// This preallocation step is essential for efficiency in Matlab 
for A = 1:numel(x) 
    for B = 1:numel(x) 
     D(A,B) = x{A} - x{B}; 
    end 
end 
1

Просто интересно, может быть, вы можете достичь что-то подобное с нормальными вектор разностных операций?

Начиная от чего-то вроде этого:

x = [1 3 3 6 8 10 15 23] 

X = repmat(x,size(x,2),1) 

делает разницу X и транспонированные вы должны получить разницу между всеми комбинациями элементов в x:

X - X' 

На этом этапе вы должны выбрать соответствующим элементам, которые вас интересуют (верхняя треугольная матрица?) и сглаживаются в вектор.

+5

'bsxfun' обычно более эффективен, чем использование repmat, например. http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/ – Dan

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