MATLAB需要帮助使用2D索引表(查找表?)

时间:2015-12-11 15:26:59

标签: matlab matrix lookup-tables

我创建了一种索引表,列出了程序需要拉出并进行一些计算的另一个2D矩阵的行索引。

例如,MATRIX 1是包含3x3的数字 [A,B,C; D,E,F; G,H,I]

和MATRIX 2是另一个矩阵大小5x5

所以,我想使用MATRIX 1中的信息从MATRIX 2中提取行并进行一些计算:

即。将MATRIX 2行#1的不同与MATRIX 2行#A,B和C相加。 第2行,MATRIX 2的D,E,F行 和行3,行G,H,I。

我不确定如何做到这一点(除了使用for循环)。我的代码中的矩阵非常大(49x111600和111600x25)。对于循环需要很长时间。

添加详细信息:

这就是我想要做的事情:

CMakeLists.txt

但由于我的数据非常大,因此需要花费很长时间才能使用2个for循环。

1 个答案:

答案 0 :(得分:0)

首先,即使您在sum(d.^2)的迭代中没有计算任何内容,您确定需要将s(i)添加到matrix1(j,i)<=0吗? 我假设没有。另外,我希望matrix1稀疏。

想法是

  1. 首先将索引一次性提取到matrix2,
  2. 然后只进行行减法,
  3. 最后进行列总结。
    1. 要获取索引,您可以使用:

      [idcs_j, idcs_i] = find(matrix1>0);

    2. 然后通过访问matrix2这样的内容进行减法:

    3. d = matrix2(idcs_i(:),:)-matrix2(matrix1((size(matrix1,1)*(idcs_i(:)-1)+idcs_j(:))),:);

      1. 现在将它们聚合为:
      2. d = sum(d.^2, 2);

        l = length(idcs_i);

        s = sparse(idcs_i(:), ones(l,1), d, size(matrix1, 2), 1);

        clear idcs_i idcs_j l d

        检查以上是否完全正确?或者更正它。

        说明:

        在步骤一个中,您要在(i,j)中提取要在matrix1中求和的索引matrix2。 (现在这一步很简单。)

        在步骤两个中,您要提取matrix2中的相应行(请参阅idcs_i(k)对应matrix1((size(matrix1,1)*(idcs_i(k)-1)+idcs_j(k))),其中(size(matrix1,1)*(idcs_i(k)-1)+idcs_j(k)))是从2-d转换1-d索引位置。

        在步骤中,d = sum(d.^2, 2)正在执行您的sum(d.^2),而s = sparse(idcs_i(:), ones(l,1), d, size(matrix1, 2), 1)正在执行您的s(i) = s(i) + *。实际上,我只使用sparse(*)函数来进行求和。并且s很可能最终成为一个完全密集的向量。 (实际上,稀疏函数会累积具有相同(i,j)索引的值。因此,它只是一个技巧,甚至可用于密集matrix1matrix2。)