gpt4 book ai didi

matlab - 将 Matlab 中矩阵的每一行与其余行进行比较

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:40 25 4
gpt4 key购买 nike

我有一个矩阵 A在 0 和 1 的 Matlab 中,尺寸为 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 条件),而我真正需要的是跟踪 内容和仅非空坐标的坐标。因此,也许“稀疏细胞”可以帮助我。

如有任何建议,我们将不胜感激。

最佳答案

不是预先计算和内存 A 矩阵(“旧 Matlab 风格”),

编写一个“生成器函数”,为您提供任何行索引的 A 矩阵的行内容。这样您就可以将内存密集型问题转换为 CPU 密集型问题。最重要的是,子结果彼此独立。

所以你需要的是

A_by_row=@(rowIdx)(....)

这样就不需要大量 RAM,您可以将您的问题分发到 parfor、GPU 甚至多个节点,然后组合子范围的子结果。

试试这个:

ListIdx=0; 
for j=1:B
for h=1:B
if sum(A_by_row(j)==A_by_row(h))~=M,
ListIdx=ListIdx+1,
B_List(ListIdx).Coordinates=[j,h],
B_List(ListIdx).Result=**YourCodeThatMakesAnArbitraryLengthVec‌​tor**,
end,
end,
end

这样,在结构“列表”中,您将获得每个条目的坐标和答案向量。

祝你好运。

关于matlab - 将 Matlab 中矩阵的每一行与其余行进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42974341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com