从Matlab中的列中的另一个元素中减去每个元素?

时间:2014-10-02 11:36:34

标签: matlab

我试图从matlab中的向量中的其他元素中减去每个元素。我知道diff(X)给出了元素的差异。假设

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)}

我不知道的是如何将它放在循环中以获得答案。非常感谢帮助。

非常感谢

3 个答案:

答案 0 :(得分:3)

可以使用bsxfun(@plus, x,-x')完成此操作。这会将逐个元素的二元操作+应用于数组x和-x' (负x转置)。


在评论中指出,bsxfun(@minus, x, x')可以实现同样的目标。


如果结果需要是矢量,则应将其更改为reshape(bsxfun(@minus, x', x),[],1)。另见Robert P的评论。

顺便说一下,你问题中的语法有点令人困惑。如前所述,{}表示结果是单元格数组,而应用diff表示正常数组。此外,为x指定值的符号表示法线向量结果,但缺少;意味着结果将是行向量。无论如何,玩转置符号,应该出现所需的结果。

答案 1 :(得分:1)

只是想知道,也许你可以用普通的矢量差分运算实现类似的东西?

从这样的事情开始:

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

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

X及其转置的差异应该会让你在x中所有元素组合之间产生差异:

X - X'

此时你应该适当选择你感兴趣的元素(上三角矩阵?)并展平成一个向量。

答案 2 :(得分: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