Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中从列中的另一个元素中减去每个元素?_Matlab - Fatal编程技术网

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

在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

我试图在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)}
我不知道的是如何把这个循环得到答案。非常感谢你的帮助


非常感谢

这可以通过
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更有效,例如。