我还没有能够找到关于我要求的现有来源,虽然我认为其他人之前已经遇到过这个问题,所以如果是这样的话,请随意标记为重复,并且我会删除这个问题。
我有两个矩阵:
A
一个Mx5
矩阵,其中4个第一列是整数,第5列填充了双精度。
B
一个Nx4
矩阵,其4列与A中的前4列相同,但顺序不同,但某些行不属于A
(我们总是M<N
)。
我想做的是:
B
中{4}}中第4行符合A
B
)
Nx1
的第5列中的值填充A
向量,其中索引处有匹配的行和零。我在这里有一些工作代码,但它很慢,因为N
将至少有2百万行(大约7s,这个过程将会重复过大)。另外,为了做我想做的事情,我现在必须根据前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
我希望这很清楚,先谢谢!
答案 0 :(得分:2)
这应该更快,因为它完全消除了对任何排序的需要。我们可以使用ismember
的第二个输出参数来查找行立即的索引,然后使用这些参数直接索引F
,并用A
填充它。< / p>
>> [~, idx] = ismember(A(:, 1:4), B, 'rows');
>> F = zeros(N, 1);
>> F(idx) = A(:, 5)
F =
0
0.0030
0.0202
0