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

离散正弦变换(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:08:45