找回密码
 注册
Simdroid-非首页
楼主: bainhome

[讨论]:cody基础数据操作题---Bullseye Matrix

[复制链接]
发表于 2013-5-23 12:00:36 | 显示全部楼层 来自 英国
顺便留个纪念:





水平有限外加平时cody玩的少,第一次拿:lol

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

点评

哈哈,恭喜恭喜!  发表于 2013-5-23 12:02
回复 不支持

使用道具 举报

发表于 2013-5-25 03:35:37 | 显示全部楼层 来自 英国
Simdroid开发平台
  数学中,简单即是美。
大家有点走火入魔了,呵呵。
nwcwww 拿奖的代码很不错了,但常人不容易想到。有更容易理解且代码也不复杂的算法。
既然大家喜欢,就继续增加一点难度,用(最简洁的)代码实现下面类型的矩阵,大家试试。
n = 1 时
0  0  0  0  0  0  0  0  0
0 -1 -1 -1 -1 -1 -1 -1  0
0 -1  0  0  0  0  0 -1  0
0 -1  0  1  1  1  0 -1  0
0 -1  0  1  0  1  0 -1  0
0 -1  0  1  1  1  0 -1  0
0 -1  0  0  0  0  0 -1  0
0 -1 -1 -1 -1 -1 -1 -1  0
0  0  0  0  0  0  0  0  0

n  = 2时
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0
0 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -1  0
0 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -1  0
0 -1 -2 -1  0  0  0  0  0  0  0  0  0 -1 -2 -1  0
0 -1 -2 -1  0  1  1  1  1  1  1  1  0 -1 -2 -1  0
0 -1 -2 -1  0  1  2  2  2  2  2  1  0 -1 -2 -1  0
0 -1 -2 -1  0  1  2  1  1  1  2  1  0 -1 -2 -1  0
0 -1 -2 -1  0  1  2  1  0  1  2  1  0 -1 -2 -1  0
0 -1 -2 -1  0  1  2  1  1  1  2  1  0 -1 -2 -1  0
0 -1 -2 -1  0  1  2  2  2  2  2  1  0 -1 -2 -1  0
0 -1 -2 -1  0  1  1  1  1  1  1  1  0 -1 -2 -1  0
0 -1 -2 -1  0  0  0  0  0  0  0  0  0 -1 -2 -1  0
0 -1 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -1  0
0 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -1  0
0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

n = 3 时
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0
0 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -1  0
0 -1 -2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -2 -1  0
0 -1 -2 -3 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  0  0  0  0  0  0  0  0  0  0  0  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  1  1  1  1  1  1  1  1  1  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  2  2  2  2  2  2  2  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  3  3  3  3  3  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  2  2  2  2  2  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  2  1  1  1  2  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  2  1  0  1  2  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  2  1  1  1  2  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  2  2  2  2  2  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  3  3  3  3  3  3  3  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  2  2  2  2  2  2  2  2  2  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  1  1  1  1  1  1  1  1  1  1  1  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1  0  0  0  0  0  0  0  0  0  0  0  0  0 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -2 -3 -2 -1  0
0 -1 -2 -3 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -2 -1  0
0 -1 -2 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -2 -1  0
0 -1 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 -1  0
0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

n = 5,6,7...

点评

lin2009老兄这次搞了一个猛的 目前还没有想出好的solution  发表于 2013-5-25 20:29
再这样搞下去,脑细胞要死光了...哈哈  发表于 2013-5-25 17:12

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-5-25 17:20:42 | 显示全部楼层 来自 新疆乌鲁木齐
本帖最后由 bainhome 于 2013-5-25 17:26 编辑

这两天有些乱七八糟的俗物,连祁工布置的二进制作业还没做出来,上来一看:lin2009兄又增加了事情的难度...
不过“最简洁”三个字一写,木有虫儿敢做声的...
老兄公布个答案吧,如果凶猛,不妨直接放到cody上让高手们做做,叫个惹眼的名字,比如Volcano meets valley around、bullseye never die、Extended extended bullseye、Bullseye have your balls busted之类,哈哈

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-26 00:03:04 | 显示全部楼层 来自 英国
之前在码字,没来得及仔细研究。
个人感觉因为有比较明显的同n相关的周期性变化,可以考虑用rem函数构造底矩阵,然后再通过操作变形成想要的样子吧。
这么做的话最简洁自然是谈不上,不过应该也还不难达到目的。
回复 不支持

使用道具 举报

发表于 2013-5-26 00:12:54 | 显示全部楼层 来自 英国
捣鼓了一阵,先提供一个解来抛砖引玉:

function ans = myfun(n)
[1:4*n+1 4*n:-1:1];
abs(n-rem(bsxfun(@min, ans, ans')-1, 2*n))-n;
ans(2*n+1:6*n, 2*n+1:6*n) = -ans(2*n+1:6*n, 2*n+1:6*n);
end

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-26 09:05:56 | 显示全部楼层 来自 重庆
凑个热闹,思路和前面的一样,循环金字塔赋值:
  1. function jj=bullseye2(x)
  2. jj=zeros(2*x+1);
  3. n=[0:-1:-x,-x+1:0,1:x,x-1:-1:0];
  4. for k=1:4*x+1
  5.     jj(k:8*x+2-k,k:8*x+2-k)=n(k);
  6. end
复制代码

点评

经过熏陶,代码短多了,呵呵  发表于 2013-5-26 09:18

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-27 14:38:52 | 显示全部楼层 来自 河北廊坊
lin2009 老兄的题目,不得不捧场啊
  1. function ans = yourfun(n)
  2. [4*n:-1:0, 1:4*n];
  3. sawtooth(bsxfun(@max,ans,ans')/2/n*pi + pi/2,.5)*n;
复制代码

点评

你娃硬是要得,这个函数你都翻得出来~~  发表于 2013-5-27 23:17
我想到了正弦函数,然后想到了锯齿波,呵呵  发表于 2013-5-27 18:24
猛!sawtooth??你哪儿知道这么多的怪胎命令?  发表于 2013-5-27 18:05

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-27 23:19:54 | 显示全部楼层 来自 英国
佩服呀,qibbxxt对Matlab相当熟悉,sawtooth是哪个工具箱的函数啊?
提到正弦,我就来个正弦函数形式的吧。
  1. n = 3;
  2. [ x2t, y2t ] = meshgrid(-4*n : 4*n);
  3. A = round(asin(sin( pi / (2*n) * max(abs(x2t), abs(y2t)))) * 2 * n / pi )
复制代码
把它推广到3维怎么样?
想像正方体包裹,裹着很多层的包装纸,每一层包装纸代表着同一数字,数字的规律与 22#  相同。
当你剥到数字为0的那层时以为可以看到礼物了,谁知“此地离陷三百里”,呵呵。

点评

正弦函数,这个思路高!另外,祁工的数学直觉简直可怕!  发表于 2013-5-27 23:32

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-5-30 22:30:40 | 显示全部楼层 来自 河北
三维的东西做起来的确很头痛,就写个简单点的,大家再讨论吧
  1. clear;clc;close all
  2. x = 2;
  3. jj=zeros(2*x+1,2*x+1,2*x+1);
  4. n= x : -1 : 0 ;
  5. for k = n
  6.     jj(x+1-k:k+x+1,x+1-k:k+x+1,x+1-k:k+x+1) = k;
  7. end
  8. jj = jj + 1;
复制代码
由于三维的显示出来,很难看出来效果,因此本人画了一个图,本来是一个动态解剖的过程,可是这里没有办法演示





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

点评

是的,是用Matlab画的  发表于 2013-6-5 09:23
祁斑竹这是matlab画的吗? 看起来很漂亮  发表于 2013-6-5 09:05

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-6-5 03:25:20 | 显示全部楼层 来自 英国
28#的代码很容易推广到3维以及更高维
三维的代码如下:

  1. clear all;
  2. clc;

  3. n = 2;
  4. T = 4*n;

  5. [x2t,y2t,z2t] = meshgrid(-T:T,-T:T,-T:T);
  6. Max_xyz = max(max(abs(x2t),abs(y2t)),abs(z2t));
  7. A = round(asin(sin(2*pi/T*Max_xyz))*T/pi/2);
复制代码
验证的代码如下:
% 验证:1、完全对称。
  1. A123 = A;
  2. A231 = permute(A,[2,3,1]);
  3. A312 = permute(A,[3,1,2]);

  4. A213 = permute(A,[2,1,3]);
  5. A321 = permute(A,[3,2,1]);

  6. isequal(A123,A231,A312,A213,A321)
复制代码
% 验证:2、分布规律。
略。(代码不复杂,但很繁琐)

点评

漂亮!佩服!  发表于 2013-6-5 10:28

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-6-5 09:20:55 | 显示全部楼层 来自 河北廊坊
本帖最后由 qibbxxt 于 2013-6-5 09:22 编辑
lin2009 发表于 2013-6-5 03:25
28#的代码很容易推广到3维以及更高维
三维的代码如下:验证的代码如下:
% 验证:1、完全对称。% 验证:2、 ...


验证构造有点麻烦,验证还行
  1. clear all;
  2. clc;
  3. n = 2;
  4. T = 4*n;
  5. [x2t,y2t,z2t] = meshgrid(-T:T,-T:T,-T:T);
  6. Max_xyz = max(max(abs(x2t),abs(y2t)),abs(z2t));
  7. A = round(asin(sin(2*pi/T*Max_xyz))*T/pi/2);

  8. % 验证构造
  9. m = round(asin(sin(2*pi/T*(0:T)))*T/pi/2);
  10. x = T ;
  11. jj=zeros(2*x+1,2*x+1,2*x+1);
  12. n= x : -1 : 0 ;
  13. for k = n
  14. jj(x+1-k:k+x+1,x+1-k:k+x+1,x+1-k:k+x+1) = k;
  15. end
  16. jj = jj + 1;

  17. % 验证
  18. arrayfun(@(x)assert(all(A(jj == x)==m(x))),1:T+1);
复制代码
不过,在验证了对称性后,这种验证办法就有点多此一举了

评分

2

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-5 10:33:52 | 显示全部楼层 来自 新疆乌鲁木齐
本帖最后由 bainhome 于 2013-6-5 10:44 编辑

正弦构型是个不容易一下想到的思路,这种数、形、位三者交互的直觉和构想方式非常值得学习,几位对bullseye matrix的多次扩展,以及多位朋友利用不同方式所完成的代码令人印象深刻。

这一贴是进行数据基础操作的simwe MATLAB版经典范例,相信如果后来者完全看完这个帖子里所有求解内容,对MATLAB的常用基本命令组合、矢量思想、常规逻辑流程等等,会有一个颇为不同的收获。

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-22 22:07 , Processed in 0.077679 second(s), 22 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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