【发布时间】:2015-10-29 10:11:23
【问题描述】:
我无法找到关于我所问内容的现有来源,尽管我认为其他人以前也遇到过这个问题,所以如果有,请随意标记为重复,我会删除这个问题。
我有两个矩阵:
A 一个Mx5 矩阵,它的前 4 列是整数,第 5 列用双精度数填充。
B Nx4 矩阵,其 4 列与 A 中的前 4 列相同,但顺序不同,并且某些行不属于 A(我们总是有 M<N) .
我想做的是:
- 获取
A中行的索引(相对于更大的矩阵B),其中前4 个值适合B中的一行 - 用
A的第5 列中的值填充Nx1向量,其中的索引处有匹配的行和其他位置为零。
我这里确实有一些工作代码,但它很慢,因为N 将至少有 200 万行(大约 7 秒,这太大了,因为该过程将被重复)。另外,为了做我想做的事,我现在必须根据前 4 列对两个矩阵中的行进行排序,从而花费更多时间。
工作代码:
N=size(B,1);
A=sortrows(A,1:4);
[B,ind]=sortrows(B);
[~,index]=sort(ind)
FinValues=zeros(N,1);
FinValues(ismember(B,A(:,1:4),'rows'))=A(:,5);
FinValues=FinValues(index);
玩具示例:
A= [134 3 16998 2 2.0234e-2;...
134 2 15557 1 3.0234e-3];
B=[17778 1 16559 4;...
134 2 15557 1;...
134 3 16998 2;...
15554 2 16998 3];
期望的输出:
FinValues=
0
3.0234e-3
2.0234e-2
0
我希望这已经足够清楚了,在此先感谢!
【问题讨论】:
-
您的工作代码缺少
N的定义,并且您的玩具示例输出FinValues = [0.0030 0.0202 0 0];- 不同的顺序。 -
查看这篇文章...这可能会有所帮助stackoverflow.com/questions/33316919/…
-
@IKavanagh :我在代码中添加了
N的定义。你有这个输出的原因是你重新定义了 N 但没有清除变量所以A和B已经排序。清除变量并再次运行它应该可以工作^^