声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 984|回复: 4

[编程技巧] 求一段二维矩阵操作的程序

[复制链接]
发表于 2008-4-16 15:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
假设有一个2维矩阵 各元素是实数

例如

1 2 3
6 9 7
4 8 5

首先需要找到里面的最大值 这个很简单 找到的就是9  这时把9的位置记下来

接下来

要在9周围 离9最近的元素里 找出一个最大值
也就是在 2 6 8 7 这4个元素里找个最大值 就是8 把8的位置记下来

然后8和9组成一个最大值俱乐部

接续在8和9周围 最近的一圈数里面找个最大值
也就是从2 6 4 5 7里面找到7(由于有边界限制 8下面就没有元素了)  把7的位置也记下来

就这样最大值俱乐部就在他的周围不断地壮大
直到 该俱乐部里的元素个数占到整个二维数组元素总数的P%就停止
例如 上面那个3乘3的矩阵的30%就是3
那么查找的结果就是 9 8 7

最后返回这些最大值俱乐部中各元素 在原矩阵中的地址


呵呵 想了半天也没想出个好方法
请大家帮忙啊
谢谢
回复
分享到:

使用道具 举报

发表于 2008-4-16 15:48 | 显示全部楼层
呵呵,自己怎么想,就怎么算

  矩阵大小知道,那么要找的最大值数目也是已知的。

     简单排序,然后找出需要的数量和位置就可以了
 楼主| 发表于 2008-4-16 19:26 | 显示全部楼层
恩 谢谢

刚自己写了个笨方法

不过这不是简单排序的
发表于 2008-4-16 20:07 | 显示全部楼层
这个问题,如果从matlab角度来说,第一步最麻烦,建议利用max库函数命令可以省很多事。后面还是慢慢排序更佳,计算量也不大
发表于 2008-4-17 11:20 | 显示全部楼层

回复 2楼 的帖子

哈哈,老大也搞错了吧,不是简单的排序.
这个数值是不是都是单值的哦?否则更麻烦.
想不到很好方法,直接按描述写估计也不是很烦吧?
另外,是不是可以建立一个n*4维新矩阵,每个行向量为[a,b,c,d],分别代表原矩阵位置中的左上右下四个元素.基本思想就是每得到一个大数,就把这个十字行的去覆盖.以上例,
[1 2 3
6 9 7
4 8 5]
产生的新矩阵a=
[0 0 2 6
1 0 3 9
2 0 0 7
0 1 9 4
6 2 7 8
9 3 0 5
0 6 8 0
4 9 5 0
8 7 0 0]
第一步,判断整个原始数组最大,值为9,序号为5;
第二步,判断a(5,:)中最大,值为8,这个"序号"为4;根据这个序号生成8在整个原数组中的序号,这个根据上下左右的关系和9的序号之间的关系很容易得到的,这里为5+3=8;
第三步,判断[a(5,:), a(8,:)] 中去掉前面已经得到的值,这步算法也很简单,find =9和8的序号,令为0就好了.(这里如果数据有重复的话可能会有问题,还要多加几步来判断有没有误赋值.挺复杂的,就是前面已经找到x个,而find找到了比x更多的值.两种情况,一种是由于产生的新数组中本来有交叉,属于正常.另外一种是还有些没考虑过的也被删了.这点还没想到很好方法.)然后再得到这里的最大值以及序号.这个序号要好好思考一下;
重复第三步,每次都多加一个4值向量,一直到循环结束.

不知道这样在写程序上能不能稍微简化点,循环个数还是有好几个...

[ 本帖最后由 wwbeyondww 于 2008-4-17 11:32 编辑 ]

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-23 11:14 , Processed in 0.052076 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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