1

我有两个单元格数组 R 和 C(两个向量,R(n 元素),C(m 元素)),我的任务是将 R 的每个元素与 R 的每个元素以及 C 的每个元素与每个元素进行比较C.比较是找到两个单元格的交集。结果我想获得两个矩阵。R nxn 的一个矩阵 Q,其中单元格 Q(i,j) 是两个元素 R(i) 和 R(j) 的交集,而 C mxm 的第二个矩阵 P,其中单元格 P(i,j) 是两个元素的交集两个元素 C(i) 和 C(j)。通常我可以使用两个for循环来做到这一点,但是我的数据很大,我想知道是否有任何方法可以加快计算速度?第一个想法是替换单元格数组,其中每个单元格中是我要比较的行(向量 R)或列(向量 C)的索引(二进制矩阵 BM 的行和列,BM 是输入数据)。因此,如果R(1) = {2 3 4}, BM 是 5x5, 那么R(1,:)=[0 1 1 1 0]. 现在拥有这个二进制矩阵 RI 可以仅通过一个循环将每一行与每一行进行比较。但是我仍然需要回到行数,例如

R(1,:) = [0 1 1 1 0];
R(2,:) = [0 1 1 0 0]; %then 
Q(1,2) = [0 1 1 0 0]; %(intersection of element R(1) and R(2)) and

C(1,:) = [1 1 0 0 0]; 
C(2,:) = [1 0 0 1 0]; %then
P(1,2) = [1 0 0 0 0]; % Now I want to obtain 
Results(i,j) = sum(BM(Q(1,2),P(1,2)))=sum(BM([2 3],[1]));

你知道如何处理这个问题,并比较两个没有两个循环的单元数组向量吗?

4

1 回答 1

1

由于Q( k, l )是带有 numCols 的向量(在您的示例中为 5),因此它不能存储在 2D 矩阵中QQ应该是 2D 单元格数组或 3D 矩阵。

直接使用二进制矩阵得到Q(行交点):

>> Q = bsxfun( @times, permute( BM, [1 3 2] ), permute( BM, [3 1 2] ) );

现在,保持 的第 - 行和第 - 行之间Q( k, l, : )的交点。 同样适用于:klBM
P

>> P = bsxfun( @times, permute( BM, [3 2 1] ), permute( BM, [2 3 1] ) );
于 2013-07-08T09:01:24.347 回答