Matlab 矩阵 提取部分非零元素组成新矩阵

问题描述:

Matlab 矩阵 提取部分非零元素组成新矩阵
现在假设有矩阵A[12300;12000;50000;00020;00006],需要将其中不是零元素的提取出来,组成新的方阵,提取后的效果是[123;120;500]和[20;06].由于矩阵A是未知的,不能用人为观测的那种提取第一行到第三行,第一列到第三列的方法.求一个通用的方法判断并提取A中非零子矩阵.
我前面说得不好,也忘打空格了.
原来的A矩阵[1 2 3 0 0;1 2 0 0 0;5 0 0 0 0;0 0 0 2 1;0 0 0 0 6]
提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[2 1;0 6]
最好能返回矩阵B和矩阵C在原矩阵上相应坐标之类的.
如果原来的A矩阵[1 2 3 0 1;1 2 0 0 0;5 0 0 0 0;0 0 0 0 0;0 0 0 0 0]
提取后要求效果是矩阵B[1 2 3;1 2 0;5 0 0]和C[1] .
矩阵A是未知的,随机的,我上面只是举个例子,希望能得到个通用的方法.
总体上来说,我的希望是是在某个a*b的随机矩阵中,找出相邻的非零的元素,然后将他们提取出来重新组成新的矩阵,新的矩阵不要求是方阵,可以是n*m的(m不等于n),其中空的元素可以用0元素代替,和聚类有点儿相似.不知道这样说能不能说清楚,我表达能力很弱.
1个回答 分类:综合 2014-11-27

问题解答:

我来补答
我觉得你的要求提的不清楚,
例如你上面举的第一个例子,结果为什么不是四个矩阵(把A再分成三个)?
应该对子矩阵的形式(例如是否要求方阵)和数量做更明确地规定才行.
再问: 我的希望是是在某个a*b的随机矩阵中,找出相邻的非零的元素,然后将他们提取出来重新组成新的矩阵,新的矩阵不要求是方阵,可以是n*m的(m不等于n),其中空的元素可以用0元素代替,和聚类有点儿相似。不知道这样说能不能说清楚,我表达能力很弱。
再答: 这么说,你划分子矩阵的原则是,子矩阵边缘的每一行(或列)中,至少存在一个非零元素,满足与它相邻的元素非零? 例如 1 0 1 0 1 0 就应该划分成三个子矩阵?
再问: 是的
再答: 确认一下你的需求:如果有图中的这样一个矩阵,是否按照图中的划分(每个彩色块代表一个子矩阵)?
再问: 嗯,是这样的,可以顺便问一下,你这个图是用什么软件画的吗?
再答: 图是用Excel画的。 先把问题描述清楚,然后我再想一想怎么做。 现在别的朋友也可以比较容易了解你的需求,有可能会有更合适的人帮助你。 祝好运。
再问: 嗯,刚才没看清,右上方第一块和右上方第二块应该是连在一起的,因为2 和4 相连了,另外最中间的蓝色和右边第二块应该也是相连的,因为5和5相连了。 当然,我实际使用的时候没有这么复杂的,因为0元素非常多,非零元素非常少,且彼此离着很远。
再答: 哦,我当时也是没太仔细看。改一下,供有能力解决的朋友参考。下午一直在忙,有空我也再考虑一下,但更欢迎能有别的朋友提供帮助。感觉如果用笨办法也可以做,但希望能想出更好的办法来。 11-27 11:05补充:程序已编好。算法算不上太好(对于大矩阵可能效率不高),但勉强可用。 编程才注意到其实上面的子矩阵划分仍然有问题——第6行第6列元素非零,结果会导致除第一列之外其它各行列都会被连到一起,而这带来的问题是,原本已经划分的子矩阵也会被包括到新的子矩阵里面,最终这个矩阵是一个完整不可分的。 程序对于第6行第6列元素为0和非0两种情况均做了测试,结果正确。 请采纳这个答案后另外提问(定向求助),我再贴出程序。不是想要额外要你的悬赏,是因为,追问的回答字数有限制,程序贴不全(即使把前面的内容都删掉也不够)。话说回来,我为解决这个问题花了大量时间,算成两个满意答案或提高悬赏我也是问心无愧的。
 
 
展开全文阅读
剩余:2000