【发布时间】:2017-08-15 21:45:47
【问题描述】:
我在 Matlab 中有一个矩阵 A,由零和维度为 BxM 的矩阵组成。
具体来说,A 包含M 空格中所有可能的 1 和 0 配置,同时考虑到顺序(因此,B=2^M)。
- 矩阵的构建使得对于任何
i=1,...,N、A(i,:)>A(j,:)或A(i,:)><A(j,:)对于j=i+1,...,N。 - 写
A(i,:)>=A(j,:)意味着A(i,h)>=A(j,h)代表h=1,...,M。 - 写成
A(i,:)>A(j,:)表示A(i,h)>=A(j,h)对应h=1,...,M,至少有一个h严格不等式。 - 写入
A(i,:)><A(j,:)意味着无法确定是A(i,:)>=A(j,:)还是相反。
例如当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)的值。 -
@AnderBiguri 我明白了,但要预测满足 if 条件的坐标并不容易。我不明白我怎么能做到这一点。
-
做近似数学。如果
(2^20)x(2^20)大小的矩阵稀疏 1%,并且在每个非零值中存储一个double(不是单元格),则需要 80Gb 的 RAM。请注意,您的提议似乎需要 更多 个值。 -
不会产生太大差异,但您的预分配不正确。您创建了一个 8x8 单元格,然后它的大小可能会在循环中更改为 9x9,具体取决于
if条件,因为j和h的最后一个值是9 -
您的代码不会产生您想要的输出。 .您的代码产生不正确的
B{1,6},B{1,7}B{1,8},B{3,8}B{5,8}
标签: matlab