Matlab:二进制矩阵的所有组合

Posted

技术标签:

【中文标题】Matlab:二进制矩阵的所有组合【英文标题】:Matlab: All combinations of binary matrix 【发布时间】:2016-04-07 03:50:13 【问题描述】:

我正在寻找一种简单的方法来获取二进制矩阵的所有组合。我已经尝试了函数perms(),但没有得到正确的结果。

例如,我有一个用 1 和 -1 填充的矩阵 N x N。当 N=2 时,会有 2^4 种可能的 1 和 -1 组合,例如

       (1 1)          (1  1)          (-1 -1)
M(1) = (1 1) , M(2) = (1 -1) , M(3) = ( 1  1) and so on...

当我使用 perms() 时,例如我没有得到第一个矩阵。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

你可以将02^(N^2)-1之间的所有数字表示为二进制数,然后再整形:

N = 2;
v = (1:2^(N^2))-1;
A = dec2bin(v)' - '0'; %'// Or use: decimalToBinaryVector(v)';
A(A==0) = -1;
A = reshape(A,N,N,2^(N^2));

【讨论】:

对我来说似乎不错,除了第一行的错字(2^N-1 而不是2^N²-1)。另外我要指出,这种方法不会强迫您将所有这些组合存储在内存中,因为它在您的矩阵和0:2^N²-1 之间提供了 1:1 的对应关系,这意味着如果您只需要获取其中一个矩阵例如,随机选择一个数字,然后应用等价 @NKN 在您的情况下,您需要删除一些重复的矩阵;该代码为A 提供了一个 2x2x24 矩阵。 (对我来说似乎很容易解决)。如果是这个答案,不知道,它确实为您提供了包含 1 和 -1 的 2x2 矩阵的所有 16 种可能性。 @NKN:在您的回答中,1s 和 -1s 的数量是固定的。 看来decimalToBinaryVector 是特定于数据采集工具箱的。我相信你应该能够对A=(dec2bin(v)-'0').'; 做同样的事情。 @AndrasDeak:我记得有一个函数可以做到这一点,但由于某种原因,Matlab 文档中的搜索给了我decimalToBinaryVector。我会编辑我的答案。谢谢!【参考方案2】:

一个简单的hack如下:

v = [1 -1 1 -1];
P = perms(v);
for ii = 1:size(P,1)
    A = reshape(P(ii,:),2,2)
end

导致:

A =

    -1    -1
     1     1

...

结果中仍有一些相同的矩阵应该被删除。

【讨论】:

用你的方法我没有得到超过两个 1 或 -1 的矩阵。 您只会得到由两个-1s 和两个1s 组合而成的矩阵。要删除重复项,我建议使用一行 P = unique(P,'rows') 来消除重复项。【参考方案3】:

我认为我找到了解决问题的方法

L = 2;
N = L^2;
v = cell(N,1);
for k = 1:N
    vk = linspace(-1,1,2);
end

ne=numel(v);
x=cell(ne,1);
[x1:ne,1]=ndgrid(vend:-1:1);
p=reshape(cat(ne+1,x:),[],ne);

F = cell(length(p),1);
for k=1:length(p)
    Fk = reshape(p(k,:),L,L);
end

【讨论】:

两件事:请不要在 SO 代码中使用 clear all,因为人们倾向于将这些代码复制到自己的代码中,而 clear 调用会搞砸一切。第二:p 是一个 65536x16 双精度,对于您的排列来说似乎有点大。所有想要的排列都在那里,但太频繁了。我认为你的尺寸有点过火了。 另外:v 只是一个 16x1 单元格,具有 16 次相同的矩阵:[-1 1]。整个循环只是写这两个数字的一​​种困难方式。 (作为旁注,我没有对这个答案投票) 我现在确实对答案投了反对票,因为虽然您确实删除了 clear,但这并不是该解决方案错误的主要观点。只需运行它并亲自查看 v 包含 16 个矩阵,全部为 [-1 1],而 p 比您需要的要大得多。这使得答案无法使用。 @Adriaan 现在,应该是对的。可以看看吗? 现在是正确的,但你仍然有 v 的奇怪分配,请参阅之前的评论作为解释。这导致x 的所有单元格都包含重复的矩阵,从而使此代码效率不高。此外,我建议不要为F 使用单元格,而是使用 3D 数组:F(:,:,k) = reshape(p(k,:),L,L); 总而言之,它可以工作,但不漂亮也不高效。不过,我删除了反对票,因为它确实有效。

以上是关于Matlab:二进制矩阵的所有组合的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中找到二进制图像中的所有连通分量?

在 MATLAB 中查找互补向量的快速方法

matlab中怎么求余数

在 Matlab 中生成矩阵的所有可能组合

Matlab:摆脱循环

在给定二进制 MxN 矩阵和切换列的能力的情况下最大化行相同性?