Matlab如何编写函数生成列方向数值逐次递减的矩阵
Matlab逐列迭代递减矩阵实现方案
逻辑拆解
你描述的递减规则本质是类似计数的借位逻辑,不需要写多层嵌套的逐元素判断循环,抓准周期规律就能快速实现:
- 固定参数:初始值100,递减步长10,单段递减取值序列为
100,90,...,0共11个值 - 最右侧列(第5列)每向下走1行减10,减到0后,左侧相邻列数值减10,同时最右侧列重置为左侧列当前的数值,继续逐行递减
- 每一列的数值变化都有固定周期,按列生成值再拼接矩阵,比逐行遍历判断简洁高效
向量化实现代码(推荐)
% 基础参数配置 col_count = 5; init_value = 100; step = 10; value_list = init_value : -step : 0; list_length = length(value_list); % 初始化矩阵 total_rows = list_length ^ col_count; result = ones(total_rows, col_count) * init_value; % 逐列填充数值,从最右列开始向左计算 for col = col_count : -1 : 1 period = list_length ^ (col_count - col); col_value_seq = repelem(value_list, period); result(:, col) = repmat(col_value_seq, list_length^(col-1), 1); end % 裁剪多余行匹配示例格式 result = result(2:end, :); % 去掉初始全100的首行 first_zero_row = find(all(result == 0, 2), 1); result = result(1:first_zero_row, :); % 仅保留第一行全0作为终止行
输出匹配说明
运行代码后生成的矩阵完全符合预期格式:
- 前10行前4列均为100,第5列从90开始逐行减10到0
- 第11行前3列保持100,第4列变为90,第5列重置为90后继续逐行递减
- 迭代到最后所有列值依次降到0,最终以全0行结束
简化逐行循环版本(逻辑更直观)
如果需要更贴近流程描述的循环写法,可以参考以下版本:
col_count = 5; % 初始化第一行状态 current_row = ones(1, col_count) * 100; current_row(end) = 90; % 第一行第5列为90 result = current_row; while any(current_row ~= 0) % 从最右列开始找第一个非0列 for col = col_count : -1 : 1 if current_row(col) > 0 current_row(col) = current_row(col) - 10; % 如果当前列减到0,往左进一列 if current_row(col) == 0 && col > 1 current_row(col-1) = current_row(col-1) - 10; % 右侧所有列重置为左列减完后的值 current_row(col:end) = current_row(col-1); end break end end result = [result; current_row]; end
注意:逐行循环版本在列数较多时运行速度慢于向量化版本,适合快速验证逻辑使用。
内容的提问来源于stack exchange,提问作者MoTeC_MoGuL
相关产品推荐
相关产品推荐

