如何无需循环实现对数组元素应用linspace生成目标矩阵?
嘿,这个需求用MATLAB的向量化操作就能轻松搞定,完全不用写for循环!下面直接上解决方案和思路:
核心思路
linspace(s, e, n)的本质是生成s + (e-s)*(0:n-1)/(n-1)这n个点。我们可以把每个元素的起始值、结束值先批量计算出来,再利用MATLAB的广播机制一次性完成所有linspace的计算。
具体代码实现
% 定义原始数组 a = [-1; 0; 1]; % 批量计算每个元素的linspace起点和终点 start_vals = min(a, 0); % 每个元素和0取最小,得到起点 end_vals = max(a, 0); % 每个元素和0取最大,得到终点 % 生成linspace的系数向量(从0到1,共3个点) coeffs = linspace(0, 1, 3); % 结果是 [0, 0.5, 1] % 利用广播计算最终矩阵 result = start_vals + (end_vals - start_vals) .* coeffs;
验证结果
运行后result会是一个3×3的矩阵,每一行对应原数组中每个元素的linspace结果:
result = -1.0000 -0.5000 0 0 0 0 0 0.5000 1.0000
完全符合需求!
补充说明
如果你的MATLAB版本比较旧(R2016b之前),不支持隐式广播,可以用bsxfun来替代:
result = bsxfun(@plus, start_vals, bsxfun(@times, (end_vals - start_vals), coeffs));
效果和上面的代码完全一样,只是写法稍繁琐一点。
这种向量化的方式不仅代码更简洁,运行效率也比for循环高很多,尤其是当数组规模很大的时候优势更明显~
内容的提问来源于stack exchange,提问作者Kapa11
相关产品推荐
相关产品推荐

