Matlab循环中如何收集迭代数值?多质心存储报错求解
解决质心坐标循环存储的维度不匹配问题
我懂你遇到的麻烦啦——每帧图像里黑点数量不一样,直接硬拼矩阵肯定会触发维度不匹配的报错,毕竟MATLAB对矩阵拼接的维度一致性要求很严格。下面给你两种实用的解决方案,核心思路都是用**单元格数组(Cell Array)**来存不同大小的质心数据,这也是MATLAB里处理这类可变长度数据的标准操作:
方案一:预分配单元格数组(推荐,效率更高)
先提前分配好对应帧数的单元格,每帧处理完就把质心矩阵存到对应的位置,完全不会有维度冲突:
% 预分配10个元素的单元格数组,对应10帧图像 centroid_list = cell(1, 10); for j = 1:10 % 注意修正imread的语法:引号要包裹完整文件名,索引j作为第二个参数 img = imread('img.tif', j); grayImg = mat2gray(img); bwImg = imbinarize(grayImg, Threshold); s = regionprops(bwImg, 'Centroid'); % 把当前帧的质心(N×2矩阵)存入单元格的第j个位置 centroid_list{j} = cat(1, s.Centroid); end
之后要查看某一帧的质心,直接用centroid_list{3}就能调出第3帧的所有坐标;如果想把所有质心合并成一个大矩阵,可以用all_centroids = vertcat(centroid_list{:});。
方案二:动态扩展单元格数组(适合帧数不确定的场景)
如果你的帧数不是固定10帧,也可以动态往单元格数组里加元素:
centroid_list = {}; % 初始化空单元格数组 for j = 1:10 img = imread('img.tif', j); grayImg = mat2gray(img); bwImg = imbinarize(grayImg, Threshold); s = regionprops(bwImg, 'Centroid'); centroids = cat(1, s.Centroid); % 把当前帧质心添加到单元格数组末尾 centroid_list = [centroid_list, {centroids}]; end
原代码报错的原因
原代码里你想用temp2 = [temp2, centroids]横向拼接矩阵,但centroids是N行2列的矩阵(N是当前帧的黑点数量):
- 一旦某帧的N和之前的不一样,横向拼接时行数不匹配,MATLAB就会抛出
horzcat维度不一致的错误。 - 另外原代码里
temp2没有初始化,第一次循环时会直接报错“未定义变量temp2”,这个小细节也得注意修正~
内容的提问来源于stack exchange,提问作者N.Nicko
相关产品推荐
相关产品推荐

