我创建了一种索引表,列出了程序需要拉出并进行一些计算的另一个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循环。
答案 0 :(得分:0)
首先,即使您在sum(d.^2)
的迭代中没有计算任何内容,您确定需要将s(i)
添加到matrix1(j,i)<=0
吗?
我假设没有。另外,我希望matrix1
稀疏。
想法是
要获取索引,您可以使用:
[idcs_j, idcs_i] = find(matrix1>0);
然后通过访问matrix2
这样的内容进行减法:
d = matrix2(idcs_i(:),:)-matrix2(matrix1((size(matrix1,1)*(idcs_i(:)-1)+idcs_j(:))),:);
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)
索引的值。因此,它只是一个技巧,甚至可用于密集matrix1
和matrix2
。)