我试图从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)}
我不知道的是如何将它放在循环中以获得答案。非常感谢帮助。
非常感谢
答案 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