在Matlab中查找相等的行

时间:2018-08-31 15:05:21

标签: matlab

我在Matlab中有一个大小为suppX的矩阵GxN和一个大小为A的矩阵MxN。如果行Xresponse与行GxM等于行Xresponse(g,m)=1,则为A(m,:),如果矩阵suppX(g,:)与行suppX=[1 2 3 4; 5 6 7 8; 9 10 11 12]; %GxN A=[1 2 3 4; 1 2 3 4; 9 10 11 12; 1 2 3 4]; %MxN Xresponse=[1 1 0 1; 0 0 0 0; 0 0 1 0]; %GxM 相等,则以Xresponsemy=zeros(size(suppX,1), size(A,1)); for x=1:size(suppX,1) Xresponsemy(x,:)=ismember(A, suppX(x,:), 'rows').'; end 的大小构建矩阵import rarfile rarfile.UNRAR_TOOL = "unrar.exe" file = rarfile.RarFile("a.rar") file.extractall()

让我用一个例子更好地解释。

rarfile.RarWarning: Non-fatal error [1]

我写了一个代码,可以完成我想要的。

$("#returnedProducts").append($("<option/>", function() {
        var object = {
                "srindex": i,
                "data-details": JSON.stringify(result[i]._source.name.family),
                "value": result[i]._source.category,
                "html": result[i]._source.category,
            };
         if (result[i]._source.fabric) {
            object["data-fabric"] = JSON.stringify(result[i]._source.fabric[1]);
         }
         return object;
    )() ); // note that the function is called here

我的代码使用循环。我想避免这种情况,因为在我的实际情况下,这段代码是另一个大循环的一部分。您有没有循环的建议吗?

2 个答案:

答案 0 :(得分:3)

一种方法是将每个矩阵视为N维空间中的向量,您可以找到每个向量的L 2 范数(或欧几里得距离)。之后,检查距离是否为0。如果是,则您有一个匹配项。具体来说,您可以创建一个矩阵,使该矩阵中的元素(i,j)计算一个矩阵中的行i与另一矩阵中的行j之间的距离。

您可以通过修改由此问题引起的距离矩阵来解决您的问题,例如1表示两个向量完全相似,否则0。

此帖子应引起关注:Efficiently compute pairwise squared Euclidean distance in Matlab

我将专门研究Shai Bagon使用矩阵乘法和广播的答案。然后,您将对其进行修改,以便找到等于0的距离:

nA = sum(A.^2, 2); % norm of A's elements
nB = sum(suppX.^2, 2); % norm of B's elements
Xresponse = bsxfun(@plus, nB, nA.') - 2 * suppX * A.';
Xresponse = Xresponse == 0;

我们得到:

Xresponse =

  3×4 logical array

   1   1   0   1
   0   0   0   0
   0   0   1   0

关于浮点效率的注意事项

由于在实现中使用的是ismember,因此对我来说隐含的是,您期望所有值都是整数。在这种情况下,您可以直接与零距离进行比较,而不会降低精度。如果您打算移至浮点,则应该始终将某个较小的阈值(而不是0)进行比较,例如Xresponse = Xresponse <= 1e-10;或类似的结果。我认为您的情况不需要这样做。

答案 1 :(得分:2)

这里是@rayryeng's answer的替代方法:使用带有'rows'输入标志的unique的第三个输出,将两个矩阵的每一行简化为唯一的标识符,然后将标识符与使用bsxfun进行单例扩展(广播):

[~, ~, w] = unique([A; suppX], 'rows');
Xresponse = bsxfun(@eq, w(1:size(A,1)).', w(size(A,1)+1:end));