【问题标题】:bsxfun rows subtraction in loopbsxfun 循环中的行减法
【发布时间】:2013-02-11 12:24:05
【问题描述】:

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

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

我有另一个 17 行和 2 列的 excel 文件 M
我想从第一行中减去所有行的值,然后从 2 中减去,等等。所以我得到这样的结果:

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

换句话说,第一行与所有其余部分、第二行与所有其余部分之间的差异......不包括第一列与第二 M excel 文件第一列中的值相同的那些行。与 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 帮助。非常感谢。

【问题讨论】:

  • 备份一分钟,并确保此代码的第一部分按您预期的方式运行。拼写错误很难分辨,但例如 horzcat(m{:}) 的结果根本不会保存到任何变量中。接下来,编写一个以手动输入的矩阵开头的小测试用例,以便这里的人们可以使用一些东西来测试/演示您的问题的解决方案。

标签: matlab row subtraction bsxfun


【解决方案1】:

D 成为n 通过2 矩阵(来自文本文件的数据)。
M by m by 2 矩阵(数据来自excel文件)。

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

[~, idx] = setdiff( D( :, 1 ), M( :, 1 ), 'stable' );

现在我们可以使用 bsxfun 来计算 all-vs-all 差异

d = bsxfun( @minus, permute( D( idx, : ), [1 3 2] ), ...
                    permute( D( idx, : ), [3 1 2] ) );

现在d 是|idx|x|idx|x2 数组,其中

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

【讨论】:

  • 您好,谢谢您的回复。我一直在尝试实现这种方法。我有几个问题。在 bsxfun 表达式中,当您在第一次排列后放置点时,您对此有何看法?我只是省略了它。最后一个表达式也给了我错误:“下标分配维度不匹配。”当我将 ii 和 jj 放入循环中时:for ii,jj=1:d_size.这就是我想定义ii和jj的方式。否则我会得到错误:“未定义的函数或变量'ii'”如果我没有提到循环。我知道这听起来可能是微不足道的问题,但我会很感激解释。谢谢!
  • @mil 关于三个点:在matlab中,如果你有一个超过一行的表达式,你可以把它剪成几行并在每行的末尾加上'...'(部分)线。见matlab doc
  • @mil 关于最后一个表达式 d( ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : ) 我确实 not 表示它是一个 Matlab 命令。我的意思是作为一般性声明,对于每个iijj(在范围内),差异D( idx(ii), :) - D( idx(jj), : ) 存储在d(ii,jj,:) 中。
  • 再次感谢您的帮助。关于 D( idx(ii), :) - D( idx(jj), : ) 存储在 d(ii,jj,:) 中。我需要结果结果为 d(6561,2)。它来自rows = 81*81,col =2 .Does d( ii, jj, : )result 给出了吗?我仍在努力理解 d(ii, jj, : ) = D( idx(ii), :) - D( idx(jj), : )。您能再解释一下吗?非常感谢!
  • @mil 用小例子试用代码并检查结果数组的内容。此外,您可以使用reshape 将结果数组重新排列为所需的尺寸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2016-08-10
  • 2018-11-20
相关资源
最近更新 更多