嵌套For循环构建DIST矩阵求助:生成2列272行指定结构矩阵
解决嵌套循环生成DIST矩阵的问题
原代码的问题
- 变量名大小写不统一:定义的是
DIST,赋值时用了Dist,Matlab区分大小写,会直接报「未定义变量」错误。 - 三层循环逻辑完全混乱:独立循环
i会导致每个i被所有j、k组合反复赋值,最终所有行都会被最后一组j、k的值覆盖,完全达不到需求。 - 赋值语句未加分号:会导致每次赋值都在命令行输出,拖慢运行速度。
正确的嵌套循环写法
X_range = 1:16; Y_range = 1:17; len_X = length(X_range); len_Y = length(Y_range); n = len_X * len_Y; DIST = zeros(n, 2); for j = 1:len_X for k = 1:len_Y % 计算当前对应的行索引:每个X元素对应len_Y行,行号为 (j-1)*len_Y + k i = (j - 1) * len_Y + k; DIST(i, 1) = X_range(j); DIST(i, 2) = Y_range(k); end end
外层循环遍历X的每个元素,内层循环遍历Y的每个元素,通过(j-1)*len_Y + k精准计算当前行的索引,确保每一组X、Y元素都放到正确的位置。
更高效的向量化实现(Matlab推荐写法)
Matlab擅长向量化操作,比循环运行更快、代码更简洁,两种常用方法:
方法1:meshgrid + reshape
X_range = 1:16; Y_range = 1:17; [X, Y] = meshgrid(X_range, Y_range); DIST = [reshape(X, [], 1), reshape(Y, [], 1)];
用meshgrid生成X和Y的网格矩阵,再通过reshape转成列向量后拼接,结果和循环写法完全一致。
方法2:repelem + repmat
X_range = 1:16; Y_range = 1:17; DIST = [repelem(X_range, length(Y_range)); repmat(Y_range, 1, length(X_range))]';
repelem把X的每个元素重复length(Y_range)次,repmat把Y数组重复length(X_range)次,最后转置成272行2列的矩阵。
内容的提问来源于stack exchange,提问作者babak asadolah
相关产品推荐
相关产品推荐

