关于matlab中的kmeans和reshape函数
2016-06-22 14:15
316 查看
matlab中自带k均值聚类函数kmeans,但使用不当可能导致一些问题,下面总结一下使用这两个函数的时候需要注意的事情。
比如说先随便造一个矩阵sample如下图:
然后对其施行kmeans聚类算法,Idx=kmeans(sample,2)该命令将聚类标号存储在Idx中,当然有时候这句话会报错如下图:
这并没有关系,看提示就知道是在迭代中没能形成簇,这时候重新多运行几次应该就可以了,这时候你看一看Idx到底存的是什么呢?
可以发现Idx是存了5行的标号,也就是说,kmeans对矩阵进行聚类的时候是按照行为单位进行聚类的,一个行向量是一个“点”,所以在图像分割中如果你直接想用reshape来显示不同类对应的图像,如以下命令就会报错了:
原因就在于原始图像是m*n的公有m*n个元素,而reshape函数要求重新塑形之后的矩阵元素要和塑形之前一样多,而你的Idx里是以行为单位的对应的只有m个元素,因此才导致上面红色的错误,为了避免这个问题,你可以在使用kmeans之前先把原矩阵reshape成一个列向量,即
这时候colsample实际上就是一个列向量了,这时候再施行kmeans算法如下图:
再看看newIdx里是什么东东?如下图:
可以发现是所有元素对应的类标号了,所以这时候如果你想看看不同类对应的图像是什么样子就可以使用reshape命令再imshow一下了,如下图:
此时就一切正常没有任何问题了
比如说先随便造一个矩阵sample如下图:
然后对其施行kmeans聚类算法,Idx=kmeans(sample,2)该命令将聚类标号存储在Idx中,当然有时候这句话会报错如下图:
这并没有关系,看提示就知道是在迭代中没能形成簇,这时候重新多运行几次应该就可以了,这时候你看一看Idx到底存的是什么呢?
可以发现Idx是存了5行的标号,也就是说,kmeans对矩阵进行聚类的时候是按照行为单位进行聚类的,一个行向量是一个“点”,所以在图像分割中如果你直接想用reshape来显示不同类对应的图像,如以下命令就会报错了:
原因就在于原始图像是m*n的公有m*n个元素,而reshape函数要求重新塑形之后的矩阵元素要和塑形之前一样多,而你的Idx里是以行为单位的对应的只有m个元素,因此才导致上面红色的错误,为了避免这个问题,你可以在使用kmeans之前先把原矩阵reshape成一个列向量,即
这时候colsample实际上就是一个列向量了,这时候再施行kmeans算法如下图:
再看看newIdx里是什么东东?如下图:
可以发现是所有元素对应的类标号了,所以这时候如果你想看看不同类对应的图像是什么样子就可以使用reshape命令再imshow一下了,如下图:
此时就一切正常没有任何问题了
相关文章推荐
- matlab制作视频,还待完善
- MATLAB读取多幅图片 借鉴
- matlab连续读取多幅图像
- 偏微分方程数值解法的MATLAB源码
- matlab2015a安装教程
- matlab中CRC的函数使用
- 如何快糙好猛地在Windows下编译CAFFE并使用其matlab和python接口
- VS2008 C++ 调用MATLAB 2009b 生成的DLL .
- MATLAB 线性拟合 决定系数R2求解
- MATLAB函数大全
- 主成分分析法的matlab实现
- 主成分回归
- 数学建模系列- 解决Matlab读取Excel文件报错:Could not start Excel server for import问题
- Matlab连接MySQL小例
- 卷积相关公式的matlab代码
- matlab在循环中保存图片命名不重复
- matlab寻找最大连通域
- matlab从入门到精通(二)matlab语言基础
- matlab之prod() rem() true() flipdim()函数\shading
- k-means聚类算法