我有两个单元格数组R和C(两个向量带有R(n元素),C(m元素)),我的任务是比较R的每个元素和R的每个元素以及C的每个元素与C的每个元素相比较。比较是找到两个单元格的交集。结果我想获得两个矩阵。 R nxn的一个矩阵Q,其中单元格Q(i,j)是两个元素R(i)和R(j)的交叉点,第二个矩阵P是C mxm的交集,其中单元格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]
。现在有了这个二进制矩阵R我可以比较每一行,每行只有一个循环。但是我仍然需要回到行数,例如
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]));
你知道如何处理这个问题,比较两个没有两个循环的单元格数组吗?
答案 0 :(得分:1)
由于Q( k, l )
是带有numCols的向量(在您的示例中为5),因此无法存储在2D矩阵中Q
:Q
应该是2D单元阵列或3D矩阵。
直接使用二进制矩阵获取Q
(行交叉点):
>> Q = bsxfun( @times, permute( BM, [1 3 2] ), permute( BM, [3 1 2] ) );
现在,Q( k, l, : )
占据了k
和l
行BM
之间的交叉点。
同样适用于P
:
>> P = bsxfun( @times, permute( BM, [3 2 1] ), permute( BM, [2 3 1] ) );