在Matlab中从列中的另一个元素中减去每个元素?
我试图在matlab中从向量中的其他元素中减去每个元素。我知道diff(X)给出了元素的差分。假设在Matlab中从列中的另一个元素中减去每个元素?,matlab,Matlab,我试图在matlab中从向量中的其他元素中减去每个元素。我知道diff(X)给出了元素的差分。假设 x = {1 3 3 6 8 10 15 23} DiffX = diff (x); 将导致 DiffX = {2 0 3 2 2 5 8} 然而,我要寻找的是每个元素与每个元素之间的差异 Diff
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)}
我不知道的是如何把这个循环得到答案。非常感谢你的帮助
非常感谢这可以通过
bsxfun(@plus,x,-x')
完成。这将逐元素二进制操作+
应用于数组x和-x'(负x转置)
正如在评论中所指出的,同样可以通过
bsxfun(@减号,x,x')
实现
如果结果需要是一个向量,则应将其更改为
重塑(bsxfun(@减号,x',x),[],1)
。另见下文Robert P的评论
顺便说一下,你问题中的语法有点混乱。如前所述,
{
和}
意味着结果是一个单元格数组,而应用diff
则表示一个正常数组。此外,为x
赋值的符号表示法向量结果,但没有代码>表示结果将是行向量。无论如何,使用转置符号,应该会出现期望的结果。这可以通过bsxfun(@plus,x,-x')
实现。这将逐元素二进制操作+
应用于数组x和-x'(负x转置)
正如在评论中所指出的,同样可以通过bsxfun(@减号,x,x')
实现
如果结果需要是一个向量,则应将其更改为重塑(bsxfun(@减号,x',x),[],1)
。另见下文Robert P的评论
顺便说一下,你问题中的语法有点混乱。如前所述,{
和}
意味着结果是一个单元格数组,而应用diff
则表示一个正常数组。此外,为x
赋值的符号表示法向量结果,但没有代码>表示结果将是行向量。无论如何,使用转置符号,应该会出现期望的结果。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
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
只是想知道,也许你能用法向量差分运算得到类似的结果
从这样的事情开始:
x = [1 3 3 6 8 10 15 23]
X = repmat(x,size(x,2),1)
执行X
的差分及其转置应该会得到X
中所有元素组合之间的差分:
X - X'
此时,您应该适当地选择感兴趣的元素(上三角矩阵?)并将其展平为一个向量。只是想知道,也许您可以实现与法线向量差分运算类似的结果
从这样的事情开始:
x = [1 3 3 6 8 10 15 23]
X = repmat(x,size(x,2),1)
执行X
的差分及其转置应该会得到X
中所有元素组合之间的差分:
X - X'
此时,您应该适当地选择感兴趣的元素(上三角矩阵?),并将其展平为向量。请记住,x
是一个单元数组。这在单元格数组上不起作用。执行diff
在单元格上也不起作用。让它为单元格工作可以通过cell2mat(x)
+1来完成,但我认为应该是bsxfun(@plus,-x,x')
来获得正确的符号@Matlaber:如果您希望它是一个单列向量,您可以这样做:重塑(bsxfun(@plus,-x,x'),[],1)
,或者res=res(:)
其中res
是bsxfun
的结果。请记住x
是一个单元格数组。这在单元格数组上不起作用。执行diff
在单元格上也不起作用。让它为单元格工作可以通过cell2mat(x)
+1来完成,但我认为应该是bsxfun(@plus,-x,x')
来获得正确的符号@Matlaber:如果希望它是一个单列向量,可以这样做:重塑(bsxfun(@plus,-x,x'),[],1)
,或者res=res(:)
其中res
是bsxfun
的结果。为什么x
是一个单元格数组?有什么原因不能是x=[1 3 3 6 8 10 15 23]
?我刚刚注意到我把x作为一个单元格,这是一个错误。很抱歉造成混淆。为什么x
是一个单元格数组?有什么原因不能是x=[1 3 3 6 8 10 15 23]
?我刚刚注意到我把x作为一个单元格,这是一个错误。抱歉造成混淆。bsxfun
通常比使用repmat更有效,例如bsxfun
通常比使用repmat更有效,例如。