Matlab 到 Octave:使用 'rows' 选项对不等大小的大矩阵与 Octave 的 ismembertol 相交函数

Matlab to Octave: intersect function with tolerance using 'rows' option for large matrices of unequal size AKA ismembertol for Octave

我正在处理两个矩阵,M 和 N,其中矩阵 M 是 20154x169,矩阵 N 是 20183x169。 M 和 N 的前两列是 x,y 坐标,其余列是在每个坐标处收集的物理 属性 的测量值。作为类比,我定义了两个任意矩阵A和B,为

A=[0,0.1,0.2,13,0,0.1,0.2,0,0.1,0.2;0,0,0,9,2,2,2,4,4,4]';
B=[12,200,45,92,0.1,0.2,14,0,0.1,0.2,0,0.1,0.21;0,3,0,0,0,0,6,2,2,2,4,4,4]';

我想与行选项相交:

[C,iA_xy,iB_xy]=intersect(A_xy(:,1:2),B_xy(:,1:2),'rows');

或使用带有公差的 ismember,以便坐标 (0.21,4) 和 (0.2,4) 被识别为相同。

理想情况下,我会利用 Matlab 的新 ismembertol 命令,但我正在使用 Octave。我搜索了替代方案,我找到的最接近的是作为问题 posed by InquilineKea in 2013 的答案发布的 bsxfun 解决方案,即

tol=0.01;
Ax=bsxfun(@minus,B(:),A(:)');
indA=any(abs(Ax)<tol,1);
[rA,cA]=ind2sub(size(A),indA);

但这不是等同于在 ismember 或 intersect 中使用 'rows' 选项的逐行解决方案,它表示矩阵 A 中的第一行 (0,0) 在矩阵 B 中很常见因为 x 坐标 0 出现在 B 的其他地方,但整行不在两者中。有没有另一种好的、简单的方法来在公差范围内挑选出两个矩阵中所有相似的 (x,y) 对并确定它们的行位置,尤其是对于大矩阵?我错过了这个解决方案对我的问题的明显扩展吗?有没有人深入了解 Matlab ismembertol 函数的机制?

我认为这可以满足您的需求(在 Matlab 中)。它对应于 ind = ismember(A,B,'rows') 公差 tol.

ind = any(squeeze(all(abs(bsxfun(@minus, B, permute(A, [3 2 1]))) <= tol, 2)), 1);

(当然,对于带有公差的ind = ismember(B,A,'rows'),只需交换上面代码中的AB)。