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】:你可以将0
和2^(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:在您的回答中,1
s 和 -1
s 的数量是固定的。
看来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 的矩阵。 您只会得到由两个-1
s 和两个1
s 组合而成的矩阵。要删除重复项,我建议使用一行 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:二进制矩阵的所有组合的主要内容,如果未能解决你的问题,请参考以下文章