我有一个矩阵(5x10000),第五行包含1到50之间的值,对应于实验的不同事件。我的目标是找到矩阵的列,这些列对于不同的事件是相同的。换句话说,我希望不同事件的所有可能组合的列结果({1,2,..,50}的子集)(例如:{1,3,7}和{7,1,3}是当然是相同的组合)。 这听起来像是集合的交集问题,每个集合都包含给定事件的所有可能结果。我也希望计算时间合理。
矩阵(5x20)的例子:
A =
20 4 4 74 20 20 3 1 1 4 3 3 3 7 4 1 20 3 3 74
36 1 1 11 36 36 3 3 3 1 3 3 3 9 4 3 36 4 3 11
77 1 1 15 77 77 1 3 3 1 1 1 1 10 3 2 77 4 1 15
9 4 4 40 9 9 2 4 4 4 2 2 2 40 1 4 9 3 2 40
3 4 2 6 7 3 4 5 2 7 4 2 7 6 7 2 5 5 1 3
在这种情况下,我们有7个不同的事件,从1到7:第5行
例如:
事件3,5和7的结果的交集是向量:[20 36 77 9]'
事件1,2,4和7的结果的交集是向量:[3 3 1 2]'
事件3和6的结果的交集是向量:[20 36 77 9]'和[74 11 15 40]'
所以我想要的是1到50之间指定数量的不同事件的公共列。例如,如何获得20个不同事件的通用列?当我想在集合{1,2,...,50}中找到20个事件的所有可能组合时,问题变得更加复杂。
对于给定数量的不同事件,我想要所有可能组合的公共列,但我给出的数字20仅作为基于一个解决方案的示例。
我会重新提出我的问题,以便更清楚:
以下矩阵是A的子矩阵,每个矩阵对应于给定的事件:
A1 = [3; 3; 1; 2; 1]
A1对应于事件1的结果
A2 = [4 1 3 1; 1 3 3 3; 1 3 1 2; 4 4 2 4; 2 2 2 2]
A2对应于事件2的结果
A3 = [20 20 74; 36 36 11; 77 77 15; 9 9 40; 3 3 3]
A3对应于事件3的结果
A4 = [4 3 3; 1 3 3; 1 1 1; 4 2 2; 4 4 4]
A4对应于事件4的结果
A5 = [1 20 3; 3 36 4; 3 77 4; 4 9 3; 5 5 5]
A5对应于事件5的结果
A6 = [74 7; 11 9; 15 10; 40 40; 6] 6
A6对应于事件6的结果
A7 = [20 4 3 4 7; 36 1 3 4; 77 1 1 3; 9 4 2 1; 7 7 7 7]
A7对应于事件的结果
我的目标是找到矩阵Ai的列(1:4,:) i = 1,2,... 7
换句话说,:
交叉(Ai,Aj)(1:4,:)用于i和j不同
交叉(Ai,Aj,Ak)(1:4,:)用于i,j和k不同 交叉(Ai,Aj,Ak,Al)(1:4,:)用于i,j,k和l不同 交叉(Ai,Aj,Ak,Al,Am)(1:4,:)对于i,j,k,l和m不同 交叉(Ai,Aj,Ak,Al,Am,An)(1:4,:)对于i,j,k,l,m和n不同 交叉(Ai,Aj,Ak,Al,Am,An,Ao)(1:4,:)用于i,j,k,l,m,n和o不同 交叉(Ai,Aj,Ak,Al,Am,An,Ao,Ap)(1:4,:)用于i,j,k,l,m,n,o和p不同当我说“交叉(Ai,Aj)(1:4,:) for i和j不同”时,我想要矩阵Ai(1:4,:)和Aj(1:4, :)
每个交点的结果可以是多个列向量,不一定是一个,具体取决于矩阵A的列。
我希望每个结果都包含矩阵Ai(1:4,:)的向量列,后跟相应的事件值,例如:if [3 3 1 2]'是A1的交点, A2,A4和A7,我想得到矢量[3 3 1 2 1 2 4 7]'
例如:十字路口(A1,A2,A3,A4)(1:4,:):我的目标是避免以下循环:
[n1 m1] = size(A1);
[n2 m2] = size(A2);
[n3 m3] = size(A3);
[n4 m4] = size(A4);
k=1;
for i1=1:m1
for i2=1:m2
for i3=1:m3
for i4=1:m4
if A1(1:4,i1)==A2(1:4,i2) && A2(1:4,i2)==A3(1:4,i3) && A3(1:4,i3)==A4(1:4,i4)
intersection1234(:,k) = [A1(1:4,i1);A1(5,i1);A2(5,i2);A3(5,i3);A4(5,i4)];
k=k+1;
end
end
end
end
end
答案 0 :(得分:2)
如果没有示例输入和所需的输出,无法确定,但我相信这是您正在尝试做的事情:
n = 1e4
tic
% Simulate data
% (Here we've split off the 5th row into a separate variable)
data = randi(5, [4 n]);
exptEvents = randi(50, 1, n);
% Find repeats
[b,i,j] = unique(data', 'rows');
% Organize the indices of the repeated columns into a cell array
reps = arrayfun(@(x) find(j==x), 1:length(i), 'UniformOutput', false);
% Find events corresponding to these repeats
reps_Events = cellfun(@(x) exptEvents(x), reps, 'UniformOutput', false);
toc
Elapsed time is 0.084577 seconds.
答案 1 :(得分:2)
如果我理解正确,您希望查找事件不同的列。以John Colby的回答为基础:
n = 1e3
tic
% Simulate data
% (Here we've split off the 5th row into a separate variable)
data = randi(5, [4 n]);
exptEvents = randi(50, 1, n);
% Find repeats
[b,i,j] = unique(data', 'rows');
% Organize the indices of the repeated columns into a cell array
reps = arrayfun(@(x) find(j==x), 1:length(i), 'UniformOutput', false);
% Find events corresponding to these repeats
reps_Events = cellfun(@(x) exptEvents(x), reps, 'UniformOutput', false);
U = cellfun(@unique, reps_Events, 'UniformOutput', false);
repeat_counts = cellfun(@length, U);
k=20;
rep_data = b(repeat_counts>=k,:);
toc
上面代码中的 U
在每个单元格中都有一组(或#34;组合")唯一事件。每个单元格也对应于唯一的数据列。如果您还需要其他东西,请举个例子。 rep_data
包含在k个或更多事件中重复的结果。