如何比较每个元素与单元格数组的每个元素没有两个循环?

时间:2013-07-08 08:47:50

标签: arrays matlab comparison cell

我有两个单元格数组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]));

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

1 个答案:

答案 0 :(得分: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] ) );