You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB中生成多维序列:基于向量i、j构造指定行矩阵(无循环)

无循环实现按向量构造行范围矩阵的MATLAB方案

嘿,刚上手MATLAB确实会遇到这种看起来简单但语法摸不清的问题,我给你两种无循环的解决方案,分别对应行长度一致和行长度不一致的情况:

情况1:所有行的长度相同(即j - i为常数)

如果你的i和j满足j(k) - i(k)对所有k都相等,比如i = [2,5,8],j = [4,7,10](每行都是3个元素),可以用矩阵广播的方式快速构造:

i = [2,5,8];
j = [4,7,10];

rows = length(i);
cols = j(1) - i(1) + 1; % 每行的元素个数
result = i(:) + (0:cols-1);

运行后result就是:

2     3     4
     5     6     7
     8     9    10

原理解释

  • i(:)把行向量转成列向量,方便和行向量0:cols-1做广播运算;
  • 广播后每个位置的数值是i(k) + m(m从0到cols-1),正好对应i(k):j(k)的序列。

情况2:行长度不一致(即j - i有不同的值)

如果各行的元素个数不一样,比如i = [1,3,5],j = [4,6,7](第一行4个元素,第二行4个,第三行3个),MATLAB的普通矩阵必须是矩形,所以我们可以用NaN填充到最长行的长度,实现无循环构造:

i = [1,3,5];
j = [4,6,7];

max_len = max(j - i + 1); % 获取最长行的元素个数
% 生成所有可能的数值,利用广播
temp = i(:) + (0:max_len-1);
% 把超出j(k)的数值替换成NaN
result = temp;
result(temp > j(:)) = NaN;

运行后result就是:

1     2     3     4
     3     4     5     6
     5     6     7   NaN

原理解释

  • 先通过max_len确定需要填充到的长度;
  • 广播生成所有起始值加偏移量的矩阵;
  • 最后筛选出超过对应j(k)的元素,替换为NaN,完美保留每行的原始序列。

另外,如果你更倾向于用cell数组存储(不需要填充NaN),也可以用arrayfun生成cell数组,也是无循环的:

result_cell = arrayfun(@(a,b) a:b, i, j, 'UniformOutput', false);

这样result_cell的每个元素就是对应行的序列,比如result_cell{1}就是1:4。

内容的提问来源于stack exchange,提问作者Barkas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:51