MATLAB需要帮助使用2D索引表(查找表?)
我创建了一个索引表,其中列出了另一个2D矩阵的行索引,程序需要将其取出并进行一些计算 例如,矩阵1是包含数字的3x3 [A,B,C;D,E,F;G,H,I] 矩阵2是另一个矩阵大小5x5 因此,我想使用矩阵1中的信息从矩阵2中取出行,并进行一些计算: i、 e.将矩阵2第1行与矩阵2第A、B和C行的差值相加。 矩阵2的第2行和第D、E、F行 第3行和第G、H、I行 我真的不知道怎么做(除了使用for循环)。我代码中的矩阵非常大(49x111600和111600x25)。对于循环,需要很长时间MATLAB需要帮助使用2D索引表(查找表?),matlab,matrix,lookup-tables,Matlab,Matrix,Lookup Tables,我创建了一个索引表,其中列出了另一个2D矩阵的行索引,程序需要将其取出并进行一些计算 例如,矩阵1是包含数字的3x3 [A,B,C;D,E,F;G,H,I] 矩阵2是另一个矩阵大小5x5 因此,我想使用矩阵1中的信息从矩阵2中取出行,并进行一些计算: i、 e.将矩阵2第1行与矩阵2第A、B和C行的差值相加。 矩阵2的第2行和第D、E、F行 第3行和第G、H、I行 我真的不知道怎么做(除了使用for循环)。我代码中的矩阵非常大(49x111600和111600x25)。对于循环,需要很长时间
添加详细信息: 这正是我想做的:
s=0;
for i = 1: size(matrix1,2)
for j = 1: size(matrix1,1)
% using matrix1 as index for rows in matrix 2
if matrix1(j,i) > 0,
d = matrix2(i,:)-matrix2(matrix1(j,i),:);
s(i) = s(i) + sum(d.^2);
end
end
end
但是,由于我的数据非常大,使用2个for循环需要很长的时间。首先,您确定需要将
sum(d.^2)
添加到s(i)
中,即使在matrix1(j,i)0)的迭代中没有计算任何内容代码>
然后通过访问matrix2
执行减法,如下所示:
d=matrix2(idcs_i(:),:)-matrix2(matrix1((大小(matrix1,1)*(idcs_i(:)-1)+idcs_j(:),:)代码>
现在将它们聚合为如下内容:
d=sum(d.^2,2)代码>
l=长度(idcs_i)代码>
s=sparse(idcs_i(:),one(l,1),d,size(matrix1,2),1)代码>
清除idcs\u i idcs\u j l d
检查上述内容是否完全正确?或者纠正它
说明:
在步骤one中,您正在matrix1
中提取要在matrix2
中求和的索引(i,j)
。(现在这个步骤就这么简单。)
在步骤two中,您正在提取matrix2
中的对应行(将其视为idcs_i(k)
对应于matrix1((大小(matrix1,1)*(idcs_i(k)-1)+idcs_j(k))
其中(大小(matrix1,1)*(idcs_i(k)-1)+idcs_j(k))
是从2-d转换的一维索引位置)
在第三步中,d=sum(d.^2,2)
正在做你的sum(d.^2)
和s=sparse(idcs_i(:),one(l,1),d,size(matrix1,2),1)
正在做你的s(i)=s(i)+*
。事实上,我只使用了sparse(*)
函数进行求和。而s
很可能最终成为一个完全稠密的向量。(实际上,稀疏函数使用相同的(i,j)
索引累加值。因此,即使使用密集的matrix1
和matrix2
),这也只是一个技巧)首先,您确定需要将和(d.^2)
添加到s(i)中吗
当矩阵1(j,i)0时,即使您在迭代中没有计算任何东西代码>
然后通过访问matrix2
执行减法,如下所示:
d=matrix2(idcs_i(:),:)-matrix2(matrix1((大小(matrix1,1)*(idcs_i(:)-1)+idcs_j(:),:)代码>
现在将它们聚合为如下内容:
d=sum(d.^2,2)代码>
l=长度(idcs_i)代码>
s=sparse(idcs_i(:),one(l,1),d,size(matrix1,2),1)代码>
清除idcs\u i idcs\u j l d
检查上述内容是否完全正确?或者纠正它
说明:
在步骤one中,您正在matrix1
中提取要在matrix2
中求和的索引(i,j)
。(现在这个步骤就这么简单。)
在步骤two中,您正在提取matrix2
中的对应行(将其视为idcs_i(k)
对应于matrix1((大小(matrix1,1)*(idcs_i(k)-1)+idcs_j(k))
其中(大小(matrix1,1)*(idcs_i(k)-1)+idcs_j(k))
是从2-d转换的一维索引位置)
在第三步中,d=sum(d.^2,2)
正在做你的sum(d.^2)
和s=sparse(idcs_i(:),one(l,1),d,size(matrix1,2),1)
正在做你的s(i)=s(i)+*
。事实上,我只使用了sparse(*)
函数进行求和。而s
很可能最终成为一个完全稠密的向量。(实际上,稀疏函数使用相同的(i,j)
索引累加值。因此,即使使用密集matrix1
和matrix2
也只是一个技巧)你说求矩阵2第1行的差的和,这只是一个数字吗?你想把它加到矩阵1第1行的每个元素上吗?您需要非常具体地说明您希望执行的操作。您的意思是使用MATRIX2(1,:)
和MATRIX2(MATRIX1(1,:),:)
?你能给我们举个例子吗?你可以在矩阵之间做数学运算,。例如:Something=Matrix1(1,:)+Matrix2(5,:)
在执行此类操作时,请注意需要具有相同大小的矩阵。。。明确您需要做什么,我们可以进一步帮助您。(ninjaed by@biker)谢谢。我只是补充了我想做的更多细节。我觉得应该有一种方法来避免循环,但不确定如何…用matrix1
中每行索引的计算覆盖diff(I,:)
。你的意思是创建一个3d矩阵吗?(另外,创建一个与内置函数同名的变量是一个可怕的想法。)你说要对矩阵2第1行的差求和,这只是一个数字吗?你想把它加到矩阵1第1行的每个元素上吗?您需要非常具体地说明您希望执行的操作。您的意思是使用MATRIX2(1,:)
和MATRIX2(MATRIX1(1,:),:)
?你能给我们举个例子吗?你可以在矩阵之间做数学运算,。例如:Something=Matrix1(1,:)+Matrix2(5,:)
小心你需要的