Matlab用嵌套for循环填充3D数组遇维度不匹配错误,求解决
解决Matlab中嵌套循环填充3D数组的维度不匹配问题
你的问题出在没有在外层循环中重置Xtemp变量,导致后续循环里Xtemp的列数不断累加,最终和X的目标维度不匹配。咱们一步步拆解:
错误原因分析
第一次外层循环j=1时,Xtemp从空开始,每次拼接illum(:,i,1),最终得到1920×16的矩阵,赋值给X(:,:,1)是没问题的。但到了j=2时,Xtemp还保留着上一轮的1920×16结果,再循环拼接16列illum(:,i,2),最后Xtemp变成了1920×32,这时候赋值给1920×16的X(:,:,2)自然就会触发维度不匹配的错误。
修复方案
这里给你三种可行的解决方法,从最小改动原代码到更高效的Matlab风格写法:
1. 重置Xtemp(最小改动原代码)
在外层循环的开头,把Xtemp重置为空矩阵,确保每一轮j循环都从干净的状态开始拼接:
X = zeros(1920,16,68); for j= 1:68 Xtemp = []; % 关键:每次外层循环重置Xtemp for i= 1:16 Xtemp = [Xtemp illum(:, i, j)]; end X(:,:,j) = Xtemp; end
2. 直接利用数组索引(最简洁高效)
如果你的illum本身就是1920×16×68的维度,其实完全不需要循环,直接赋值就行:
X = illum;
如果illum的维度顺序不对(比如是1920×68×16),可以用permute调整维度顺序:
X = permute(illum, [1 3 2]); % 将第三维度移到第二维度的位置
3. 预分配Xtemp(更高效的循环写法)
Matlab中频繁拼接数组会降低效率,建议预分配Xtemp的内存,然后直接给列赋值:
X = zeros(1920,16,68); for j= 1:68 Xtemp = zeros(1920,16); % 预分配内存,避免动态扩容 for i= 1:16 Xtemp(:,i) = illum(:, i, j); end X(:,:,j) = Xtemp; end
内容的提问来源于stack exchange,提问作者Mimi S.
相关产品推荐
相关产品推荐

