【发布时间】:2014-02-09 11:14:31
【问题描述】:
我有一个大矩阵需要处理,我们称之为Z。
Z 有这种格式的元素,大约 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,:) 以获取具有所需顺序的行的矩阵。
我正在使用Z2,Z 的副本来提取最终答案变量,因为我在 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,太累了,我很抱歉。不需要第二场比赛。还原代码示例。