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
相关产品推荐
相关产品推荐

