【问题标题】:MATLAB Need help using 2D index table (look up table?)MATLAB 需要帮助使用 2D 索引表(查找表?)
【发布时间】:2015-12-11 15:26:59
【问题描述】:

我创建了某种索引表,其中列出了程序需要提取并进行一些计算的另一个二维矩阵的行索引。

例如,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)。而且 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 循环。

【问题讨论】:

  • 你说矩阵2第1行的差求和,那只是一个数字吗?并且您想将其添加到矩阵 1 的第 1 行的每个元素中?您需要非常具体地说明您希望执行的操作。
  • 你的意思是对MATRIX2(1,:)MATRIX2(MATRIX1(1,:),:)做点什么?能给我们举个例子吗?
  • 您可以在矩阵之间进行数学运算,。 IE:Something=Matrix1(1,:)+Matrix2(5,:)注意,在进行此类操作时,您需要拥有相同大小的矩阵...澄清您需要做什么,我们可以为您提供进一步的帮助。 (@beaker 忍者)
  • 谢谢。我只是添加了更多关于我想做的事情的细节。我觉得应该有办法避免循环,但不确定如何......
  • 您正在用matrix1 中每个行索引的计算覆盖diff(i,:)。您的意思是创建一个 3d 矩阵吗? (另外,创建一个与内置函数同名的变量是一个可怕的想法。)

标签: matlab matrix lookup-tables


【解决方案1】:

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


这个想法是

  1. 首先一次性提取到 matrix2 的索引,
  2. 然后只一次做所有的行减法,
  3. 最后进行列求和。

  1. 要获取索引,您可以使用:

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

  2. 然后通过访问matrix2 来做减法:

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

  1. 现在将它们聚合为如下所示:

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 中,您正在提取 matrix1 中的索引 (i,j),您希望在 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)。

在步骤第三中,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 一起使用也只是一个技巧。)

【讨论】:

  • 哦,那个 s 应该在 if 语句中。谢谢!我不太确定稀疏。我在 MATLAB 页面上阅读了它,但仍然无法获得一个好的概念。你介意解释一下吗?
  • 我们用一个例子来理解。考虑一个大小为1000X1000integer 矩阵。现在,假设您的矩阵有很多 zero 元素,并且说只有 100 个 non-zero 元素。也就是说,比如说(1,2), (1,17), (26,300), etc.,那么如果你只存储100个non-zero元素及其位置(i,j)。您只需将3X100=300 整数存储在memoryuncompressed 形式中。所以你节省了1000X1000-300 整数大小的内存。就是这样。
  • 谢谢!我将尝试使用代码来更好地理解第二步和稀疏矩阵:)
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多