gpt4 book ai didi

matlab - 找到两个 Matlab 矩阵之间的相等行

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:39 26 4
gpt4 key购买 nike

我在 Matlab 中有一个大小为 GxN 的矩阵 index 和一个大小为 MxN 的矩阵 A

在提出问题之前,让我先举个例子。

clear
N=3;
G=2;
M=5;

index=[1 2 3;
13 14 15]; %GxN

A=[1 2 3;
5 6 7;
21 22 23;
1 2 3;
13 14 15]; %MxN

我需要你的帮助来构造一个矩阵Response,大小为GxMResponse(g,m)=1,如果行A(m,:) 等于 index(g,:) 否则为零。

继续上面的例子

Response= [1 0 0 1 0; 
0 0 0 0 1]; %GxM

这段代码做了我想要的(取自 previous question of mine - 只是为了澄清:当前的问题是不同的)

Response=permute(any(all(bsxfun(@eq, reshape(index.', N, [], G), permute(A, [2 3 4 1])), 1), 2), [3 4 1 2]);

但是,对于我的实际矩阵大小(N=19,M=500,G=524288),该命令非常慢。我知道我无法获得巨大的速度,但欢迎任何可以改进的东西。

最佳答案

方法一:计算距离

如果您有统计工具箱:

Response = ~(pdist2(index, A));

或:

Response = ~(pdist2(index, A, 'hamming'));

这是有效的,因为 pdist2计算每对行之间的距离。相等行的距离为 0。逻辑否定 ~ 为这些行对提供 1,否则为 0

方法 2:将行减少为唯一的整数标签

这种方法在我的机器上更快:

[~,~,u] = unique([index; A], 'rows');
Response = bsxfun(@eq, u(1:G), u(G+1:end).');

它的工作原理是将行减少为唯一的整数标签(使用 unique 的第三个输出),然后比较后者而不是前者。

对于您的尺寸值,这在我的计算机上大约需要 1 秒:

clear
N = 19; M = 500; G = 524288;
index = randi(5,G,N); A = randi(5,M,N);
tic
[~,~,u] = unique([index; A], 'rows');
Response = bsxfun(@eq, u(1:G), u(G+1:end).');
toc

给予

Elapsed time is 1.081043 seconds.

关于matlab - 找到两个 Matlab 矩阵之间的相等行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52624723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com