MATLAB 需要帮助使用 2D 索引 table(查找 table?)
MATLAB Need help using 2D index table (look up table?)
我创建了某种索引 table,其中列出了程序需要提取并进行一些计算的另一个二维矩阵的行索引。
例如,MATRIX 1 是一个包含数字的 3x3
[甲、乙、丙; D、E、F; G, H, I]
矩阵 2 是另一个大小为 5x5 的矩阵
所以,我想使用 MATRIX 1 中的信息从 MATRIX 2 中提取行并进行一些计算:
即求和 MATRIX 2 行 #1 与 MATRIX 2 行 #A、B 和 C 的差值。
第 2 行与矩阵 2 的 D、E、F 行
和第 3 行,第 G、H、I 行。
我不太确定该怎么做(除了使用 for 循环)。我的代码中的矩阵非常大(49x111600 和 111600x25)。而且 for 循环需要很长时间。
添加详细信息:
这正是我想做的事情:
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
的迭代中没有计算任何东西吗?
我假设不会。另外,我希望 matrix1
是稀疏的。
想法是
- 首先一次性提取matrix2的索引,
- 然后只做一次所有的行减法,
- 最后做列求和。
要获取索引,您可以使用:
[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
检查以上是否完全正确?或者更正它。
解释:
在步骤 one 中,您正在提取要在 matrix2
中求和的 matrix1
中的索引 (i,j)
。 (现在这一步就这么简单了。)
在步骤 two 中,您正在提取 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 索引位置
在步骤 three 中,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
一起使用也只是一个技巧。)
我创建了某种索引 table,其中列出了程序需要提取并进行一些计算的另一个二维矩阵的行索引。
例如,MATRIX 1 是一个包含数字的 3x3 [甲、乙、丙; D、E、F; G, H, I]
矩阵 2 是另一个大小为 5x5 的矩阵
所以,我想使用 MATRIX 1 中的信息从 MATRIX 2 中提取行并进行一些计算:
即求和 MATRIX 2 行 #1 与 MATRIX 2 行 #A、B 和 C 的差值。 第 2 行与矩阵 2 的 D、E、F 行 和第 3 行,第 G、H、I 行。
我不太确定该怎么做(除了使用 for 循环)。我的代码中的矩阵非常大(49x111600 和 111600x25)。而且 for 循环需要很长时间。
添加详细信息:
这正是我想做的事情:
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
的迭代中没有计算任何东西吗?
我假设不会。另外,我希望 matrix1
是稀疏的。
想法是
- 首先一次性提取matrix2的索引,
- 然后只做一次所有的行减法,
- 最后做列求和。
要获取索引,您可以使用:
[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
检查以上是否完全正确?或者更正它。
解释:
在步骤 one 中,您正在提取要在 matrix2
中求和的 matrix1
中的索引 (i,j)
。 (现在这一步就这么简单了。)
在步骤 two 中,您正在提取 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).
在步骤 three 中,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
一起使用也只是一个技巧。)