BxM
的由零和一组成的 Matlab 矩阵 A
。具体来说,
A
包含了所有在考虑顺序的情况下 M
个位置上可能的 0 和 1 的排列方式(因此,B=2^M
)。以下是该矩阵的构建规则:
- 对于任意
i=1,...,N
,都有 A(i,:)>A(j,:)
或 A(i,:)><A(j,:)
对于 j=i+1,...,N
。
- 表示 A(i,:)>=A(j,:)
意味着对于所有的 h=1,...,M
,A(i,h)>=A(j,h)
。
- 表示 A(i,:)>A(j,:)
意味着对于所有的 h=1,...,M
,至少存在一个 h
满足 A(i,h)>A(j,h)
。
- 表示 A(i,:)><A(j,:)
意味着无法确定 A(i,:)>=A(j,:)
还是 A(j,:)>=A(i,:)
。例如,当
M=3
时: A=[1 1 1; 1 1 0; 1 0 1; 1 0 0; 0 1 1; 0 1 0; 0 0 1; 0 0 0];
考虑以下内容:
B=cell(2^M, 2^M);
对于任意可以比较的两行
A
,即A(i,:)>A(j,:)
,我想要B{i,j}
包含所有行A(k,:)
,使得A(j,:)<A(k,:)<A(i,:)
。在上面的例子中,期望的输出为:
B{1,4}=[1 1 0; 1 0 1];
B{1,6}=[1 1 0; 0 1 1];
B{1,7}=[1 0 1; 0 1 1];
B{1,8}=[1 1 0; 1 0 1; 1 0 0; 0 1 1; 0 1 0; 0 0 1];
B{2,8}=[1 0 0; 0 1 0];
B{3,8}=[1 0 0; 0 0 1];
B{5,8}=[0 0 1; 0 1 0];
这段代码做了我想要的事情。
B=cell(2^M, 2^M);
for j=1:size(A,1)
for h=1:size(A,1)
if sum(A(j,:)==A(h,:))~=M && sum(A(j,:)>=A(h,:))==M %if A(j,:)>A(h,:) according to the meaning indicated above
B{j,h}=A(any(bsxfun(@ne, A,A(j,:)),2) & any(bsxfun(@ne, A,A(h,:)),2) &...
all((bsxfun(@le, A,A(j,:)) & bsxfun(@ge, A,A(h,:))),2),:);
end
end
end
然而,以上代码不可行,因为在我的实际案例中,
M=20
。您是否有建议,是否可能加速执行,并且如果可能,怎么做?该代码的主要问题之一是对于
M=20
,它需要预分配一个大小为 (2^20)x(2^20)
的单元格,显然这是无法完成的。另一方面,在双重循环的末尾,许多单元格为空(因为 if 条件未满足许多行对),我真正需要的是仅跟踪非空单元格的内容和坐标。因此,也许,“稀疏单元格”可以帮助我解决这个问题。
非常感谢任何建议。
(2^20)x(2^20)
的单元格,只需预分配一个准备填充的结构即可。一个单元格已经是一个“稀疏”的单元格。您只是有太多的数据。请尝试大致估算您需要填充其中的(2^20)x(2^20)
值的数量。 - Ander Biguri(2^20)x(2^20)
的矩阵只有1%是稀疏的,并且在每个非零值中存储一个double
(而不是单元格),则需要80Gb的RAM。请注意,您的建议似乎需要比这更多的值。 - Ander BiguriB{1,6}
,B{1,7}
,B{1,8}
,B{3,8}
,B{5,8}
。 - Sardar Usama