【问题标题】:Reorder large matrix or extract rows in specific order determined by column pair values重新排序大矩阵或按列对值确定的特定顺序提取行
【发布时间】:2014-02-09 11:14:31
【问题描述】:

我有一个大矩阵需要处理,我们称之为ZZ 有这种格式的元素,大约 200.000 行:

 2     3     6   723
 3     4     7    65
 3     4     8    20
 3     6     9    10
 4     5     9   127
 4     5    10   120
 4     5    11   291
 4     7    14   576
 5     7     8   365
 5     9    11   216
 6     9    12    40
.....

没有行重复。 第 4th 列代表一种 ID。 每行的前 3 列按升序排序。 这些行也按第一列中的值的升序排列。

如果第 1 列有 2 行相同的数字,则第 1 行是第 2nd 列中最小值的行。同样的原则适用于 3rd 列。例如,这可以在这些行中看到:

 4     5     9   127
 4     5    10   120
 4     5    11   291
 4     7    14   576

我需要获取下面格式的矩阵,我在行之间添加了空格,以便您可以轻松查看模式。

总而言之,我需要获得一个矩阵,其中一行需要紧跟在第 1 列和第 2 列中的所有其他行之后,该行在第 2 列和第 3 列中具有相同的值对。如果没有与当前处理的行相似的行,只需将其添加到矩阵中,并以类似的方式处理下一行。

请看下面,2:3 列中的配对 (3,6),1:2 列中的配对 (3,6)。对 (4,7) 相同。对 (4,8) 没有匹配项。

2     3     6   723
3     6     9    10

3     4     7    65
4     7    14   576

3     4     8    20

4     5     9   127
5     9    11   216

4     5    10   120
4     5    11   291
5     7     8   365
6     9    12    40

考虑到Z 的大小,我的以下代码非常慢。

T 中,我正在收集Z 的行索引。我没有让它完全运行,因为它花了超过 30 分钟,不幸的是,这样的运行时间将毫无用处。

最后,我希望我能够执行以下操作:answer = Z2(T,:) 以获取具有所需顺序的行的矩阵。

我正在使用Z2Z 的副本来提取最终答案变量,因为我在 while 循环内修改 Z,对我已经测试过的行和已经找到的模式使用零,希望不会在最终答案中出现重复。

Z2 = Z;
T = zeros(size(Z,1),1);
i = 0;
count = 1;
while size(T(T~=0),1) ~= size(Z,1)
    i = i + 1;
    if(isequal(Z(i,:),[0 0 0 0]))
        continue;
    end
    p = find(ismember(Z(:,1:2),Z(i,2:3),'rows'));
    T(count) = i;
    if(~isempty(p))
        T(count + 1:count + size(p,1)) = p;
    end
    Z(i,:) = 0;
    Z(p,:) = 0;
    count = count + size(p,1) + 1;
 end

【问题讨论】:

  • 您需要新矩阵来包含重复吗?我的意思是:如果[2 3 6 X; 3 6 9 Y] 是一对,[3 6 9 Y; 6 9 12 Z] 也应该是一对,[3 6 9 Y] 明确复制?
  • @RodyOldenhuis Arghh,太累了,我很抱歉。不需要第二场比赛。还原代码示例。

标签: matlab matrix


【解决方案1】:

嗯,一个可能的加速可能是进行以下替换:

%// p = find(ismember(Z(:,1:2),Z(i,2:3),'rows'));
p = find( all(bsxfun(@eq, Z(:,1:2), Z(i,2:3)),2) );

这是因为 ismember 不是内置的,因此 MATLAB 的 JIT 编译器无法有效地加速您的循环。

我感觉可以做更多的事情,但请先尝试一下。在我的 PC(MATLAB R2010b,Win 7,64 位)上,速度提高了大约 10 倍,但在您的机器上的配置文件更好,需要在您的上下文中进行验证。

【讨论】:

  • 太棒了!我非常感谢!计算需要 338.6 秒,对于我的目的来说,这是一个完全可以接受的时间,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2022-09-29
  • 2017-02-03
  • 2018-04-24
  • 1970-01-01
相关资源
最近更新 更多