查看: 71|回复: 2|关注: 0
打印 上一主题 下一主题

[已解决] 如何生成限定范围内所有可能的矩阵?

[复制链接]

新手

7 麦片

财富积分


050


3

主题

4

帖子

0

最佳答案
需求是,我想生成元素只能是0或者1的3*3矩阵,比如:0 0 0? ? 0 1 0
? ?? ?? ? 0 1 0? ? 1 1 0? ? 。。。
? ?? ?? ? 0 0 1? ? 1 0 0
如何生成所有满足此条件的矩阵?
之前发过帖,我以为我解决了
b = unique(perms([0 0 0 0 0 0 0 0 1]),'rows')
for i=1:9
c(:,:,i) = reshape(b(i,:),3,3)
end
通过修改perms函数里数组1的个数就可以生成所有可能的排列,然后reshape就可以生成对应的矩阵。

但现在又有问题,我打算统计4*4甚至5*5矩阵了,这样就有16个甚至25个元素,perms函数只支持最多10个元素,求问有没有什么好的解决方法?

ps:这只是我算法的一部分,我的实际需求并不是得到这些矩阵,而是为了统计只有0和1元素的矩阵中出现101或者010序列(无论横纵)的矩阵有多少个,是的,只是为了统计个数字。后面序列检测部分已经解决的。



论坛优秀回答者

权威

3783 麦片

财富积分



3

主题

3962

帖子

845

最佳答案
  • 关注者: 178
2#
发表于 昨天?16:12 | 只看该作者 |此回复为最佳答案
ff2n(16)、ff2n(25)
ff2n(25) Requested 33554432x25 (6.3GB)。你的内存够吗?

MATLAB 基础讨论
版块优秀回答者

入门

73 麦片

财富积分


50500


0

主题

68

帖子

15

最佳答案
3#
发表于 昨天?20:12 | 只看该作者
本帖最后由 alvinlau 于 2019-9-24 07:23 编辑

才五阶的话选对函数再降个维,开销不大的。数据量大了拿循环写回溯应该比写成矩阵运算形式效率高点。不求通用性的话可以参考下思路


tic
n=5;
a=ff2n(n)+48;
b=char(a(~contains(cellstr(char(a)),{'010','101'}),:));
queue=size(b,1);
count=0;
for r1=1:queue
? ? for r2=1:queue
? ?? ???for r3=1:queue
? ?? ?? ?? ?if ~sum(contains(cellstr(b([r1 r2 r3],:)'),{'010','101'}))
? ?? ?? ?? ?? ? for r4=1:queue
? ?? ?? ?? ?? ?? ???if ~sum(contains(cellstr(b([r2 r3 r4],:)'),{'010','101'}))
? ?? ?? ?? ?? ?? ?? ?? ?for r5=1:queue
? ?? ?? ?? ?? ?? ?? ?? ?? ? count=count+~sum(contains(cellstr(b([r3 r4 r5],:)'),{'010','101'}));
? ?? ?? ?? ?? ?? ?? ?? ?end
? ?? ?? ?? ?? ?? ???end
? ?? ?? ?? ?? ? end
? ?? ?? ?? ?end
? ?? ???end
? ? end
end
result=2^(n*n)-count
toc



result =

? ? 33494200

时间已过 4.103095 秒。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表