如何在Matlab中实现贝塞尔曲线计算相关循环的向量化
Matlab贝塞尔曲线循环的向量化实现方案
1. 二项式系数单循环的向量化
报错原因
你最初改写报错的核心原因是误用了Matlab的运算符:*和/默认是矩阵乘法、矩阵除法,而你需要的是元素级运算,对应运算符是.*和./。
正确实现方式
方法1:基于阶乘的修正写法
i = 1:n; a = factorial(n-1) ./ (factorial(i-1) .* factorial(n - i));
方法2:更稳定的内置函数实现(推荐)
Matlab自带二项式系数计算函数nchoosek,比手动计算阶乘的数值稳定性更高、不容易出现大数溢出:
a = nchoosek(n-1, 0:n-1);
2. 点位计算嵌套循环的向量化
实现思路
利用Matlab的自动广播(维度自动扩展)特性,把控制点维度和采样点t的维度分别调整为列、行,二者运算时会自动扩展为n行*(c-2)列的基函数矩阵,最后通过矩阵乘法一次性完成所有项的求和,完全消除嵌套循环。
完整向量化代码
% 提取需要计算的采样点(对应原循环j=2到c-1) t_sample = t(2:end-1); % 调整i的维度为n行1列,用于广播 i_idx = (1:n)'; % 一次性计算所有控制点、所有采样点对应的贝塞尔基函数值,维度为n行*(c-2)列 B = a' .* (t_sample .^ (i_idx - 1)) .* ((1 - t_sample) .^ (n - i_idx)); % 矩阵乘法直接完成求和,得到所有采样点的坐标 bx(2:end-1) = px' * B; by(2:end-1) = py' * B;
兼容旧版本Matlab的写法
如果使用的Matlab版本不支持自动广播,可以用bsxfun实现等价逻辑:
t_sample = t(2:end-1); i_idx = (1:n)'; B = bsxfun(@times, a', ... bsxfun(@times, bsxfun(@power, t_sample, i_idx-1), ... bsxfun(@power, 1-t_sample, n - i_idx))); bx(2:end-1) = px' * B; by(2:end-1) = py' * B;
内容的提问来源于stack exchange,提问作者Mantej Sokhi
相关产品推荐
相关产品推荐

