Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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 循环中的BSX行减法_Matlab_Row_Subtraction_Bsxfun - Fatal编程技术网

Matlab 循环中的BSX行减法

Matlab 循环中的BSX行减法,matlab,row,subtraction,bsxfun,Matlab,Row,Subtraction,Bsxfun,我有一个98行2列的文本文件D。看起来像这样: 10 0.261344 11 0.456167 12 0.668595 2 0.481754 ... 等 我还有一个excel文件M,有17行2列。 我想从第1行减去所有行的值,然后从第2行减去,以此类推,得到如下结果: 10-11-0.194823 10-12-0.407251 ... 等 换句话说,第1行和所有其他行、第2行和所有其他行之间的差异。不包括第1列的值与第2 M excel文件第1列中的值相同的行。这与81行相比有很大的不同 我一直

我有一个98行2列的文本文件
D
。看起来像这样:

10 0.261344
11 0.456167
12 0.668595
2 0.481754
... 等

我还有一个excel文件
M
,有17行2列。
我想从第1行减去所有行的值,然后从第2行减去,以此类推,得到如下结果:

10-11-0.194823
10-12-0.407251
... 等

换句话说,第1行和所有其他行、第2行和所有其他行之间的差异。不包括第1列的值与第2 M excel文件第1列中的值相同的行。这与81行相比有很大的不同

我一直在尝试使用这个:

M = xlsread('...');    

FSumID=fopen(D);
 MatrixSub = loadD);
 m = textscan(FSumID,'%d %f');
horzcat(m{:}) 

NewData = M(:,1)
D_size=size(D);

for i=1:D_size

 if (ptvBodyDist(:,1)~=NewData(i))
%for calculating 
 DVec = bsxfun(@minus, ((m{i,2})), (m{i,2}));
%当我检查这个时,它只给出一个全零(98,1)的循环,而我需要((98-17)^2,1)。我需要更改表达式的最后一部分以得到我想要的结果,但我被bsxfun卡住了。我不知道如何制作正确的表达式来减去所有行


我是Matlab新手,非常感谢您的帮助。另外,如果您能推荐一些手册或教程,除了mathworks帮助之外。非常感谢。

D
be
n
by
2
矩阵(文本文件中的数据)。
M
by
M
by
2
矩阵(数据来自excel文件)

第一阶段是使用查找
D
的相关
n-m
行:它们的第一个值没有出现在
m
中的行

现在我们可以使用
bsxfun

d = bsxfun( @minus, permute( D( idx, : ), [1 3 2] ), ...
                    permute( D( idx, : ), [3 1 2] ) );
现在
d
是|
idx
|x
idx
|x
2
数组,其中

d( ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : )

备份一分钟,确保此代码的第一部分按照您的预期工作。拼写错误使您很难分辨,但例如
horzcat(m{:})的结果
根本不会保存到任何变量。接下来,编写一个小测试用例,以手动输入的矩阵开始,这样这里的人就可以测试/演示问题的解决方案。您好,谢谢您的回答。我一直在尝试实现此方法。我有几个问题。在bsxfun表达式中,当您在r首先排列它是什么?我只是省略了它。最后一个表达式给了我错误:“下标赋值维度不匹配。”当我把ii和jj放入循环中时:对于ii,jj=1:d_size。这就是我如何定义ii和jj的想法。否则我会得到错误:“未定义的函数或变量‘ii’”如果我不提循环。我知道这听起来可能是一个微不足道的问题,但我会非常感谢你的解释。谢谢!@mil关于三点:在matlab中,如果你有一个表达式比一行长,你可以将它切割成几行,并在每一行(部分)的末尾加上“…”。请参见@mil关于最后一个表达式
d(ii,jj,:)=D(idx(ii),:)-D(idx(jj),:)
我不是说它是一个Matlab命令。我是说它是一个一般性的声明,对于每个
ii
jj
(在范围内)diff
D(idx(ii),:)-D(idx(jj),
存储在
D(ii,jj,:)
中。再次感谢您的帮助。关于D(idx(ii),:)-D(idx(jj),jj,:)存储在d(ii,jj,:)中…我需要的结果是d(6561,2)。它来自行=81*81,列=2。d(ii,jj,:)结果给出了吗?我还在试图理解d(ii,jj,:)=d(idx(ii),:)-d(idx(jj),:)。请您再解释一下好吗?非常感谢!@mil使用小示例尝试代码并检查结果数组的内容。此外,您还可以使用将结果数组重新排列到所需的维度。
d( ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : )