离散正弦变换(DST)矩阵脚本首行异常为零问题咨询
解决DST矩阵首行全零的问题
看起来你写的离散正弦变换矩阵生成脚本遇到了两个关键问题,导致首行全为零,我来帮你拆解并修正:
问题1:变量名笔误
你脚本最后一行的c(1,:)是个明显的笔误——前面定义的网格变量是cc,但这里你应该是想引用已经计算好的x矩阵,所以这行应该改成x(1,:) = x(1,:) / sqrt(2);。不过这不是首行全零的核心原因,真正的问题在下面。
问题2:行索引起始值导致正弦项恒为零
你的代码里用meshgrid(0:n-1)生成了行索引rr,它的取值是从0到n-1。当rr=0时,正弦函数的参数pi*(2*cc + 1) .* rr / (2 * n)直接变成0,而sin(0)始终是0,这就导致首行所有元素都为零。
修正后的代码
我们只需要调整行索引的起始值(或者在公式里对rr做偏移),就能让首行的正弦项产生非零值。同时修正变量笔误,调整后的代码如下:
方案1:让行索引从1开始
function x = dstmtx(n) [cc, rr] = meshgrid(0:n-1, 1:n); % 行索引rr从1到n,列索引cc从0到n-1 x = sqrt(2 / n) * sin(pi * (2*cc + 1) .* rr / (2 * n)); % 若生成DST-I类型矩阵,首行和末行需调整缩放因子(DST-II可省略这两步) x(1,:) = x(1,:) / sqrt(2); x(end,:) = x(end,:) / sqrt(2);
方案2:保持索引从0开始,对rr做偏移
function x = dstmtx(n) [cc, rr] = meshgrid(0:n-1); x = sqrt(2 / n) * sin(pi * (2*cc + 1) .* (rr + 1) / (2 * n)); x(1,:) = x(1,:) / sqrt(2); x(end,:) = x(end,:) / sqrt(2);
验证效果
当n=4时,修正后的脚本生成的矩阵首行就是你期望的非零值:0.2706 0.6533 0.6533 0.2706——这和你之前给出的矩阵第二行一致,因为原来的代码把行索引偏移了一位,现在修正后就完全正常了。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

