首页 > 解决方案 > 对矩阵执行平滑函数,但现在只有匹配的索引给出值

问题描述

我有一个 1000x1000x50 的矩阵,我在循环中沿第三维对每个向量执行了一个函数(1,000,000 个向量,50 个元素长)。当我尝试查看 m=n 的任何特定元素时,即 (1000,1000,40) ,将显示一个非零值。但是,当我尝试查看 m =/= n 的元素时,即 (1000,1001,40),只返回 0。我知道 (1001,1001,40) 具有非零值,并且我知道原始矩阵在 (1000,1001,40) 处具有非零元素。

这是我使用的循环:

mymatrix_new = zeros(size(mymatrix));
for i=1:length(mymatrix)
    mymatrix_new(i,i,:) = wdenoise(squeeze(mymatrix(i,i,:)));
end

对于 DO 显示的值,结果是我所期望的——一个平滑的信号。我只是不明白为什么当 m 和 n 索引不相同时某些非零元素显示为零。

标签: matlab

解决方案


您只迭代和更新具有 m == n 的单元格。发生这种情况是因为您使用了一个 for 循环。所有其他值都不会被访问并且永远不会更新,这就是它们保持为零的原因。

如果你看看你的 for 循环:

for i=1:length(mymatrix)

在第一次迭代中 i = 1 它将更新:

mymatrix_new(1,1,:) = wdenoise(squeeze(mymatrix(1,1,:)));

在第二次迭代中 i = 2 它将更新:

mymatrix_new(2,2,:) = wdenoise(squeeze(mymatrix(2,2,:)));

如您所见,您永远不会更新 mymatrix_new(1, 2) 或除具有 m == n == i 的单元格以外的任何单元格

您需要使用两个嵌套的 for 循环,以便更新i和的所有组合j

mymatrix_new = zeros(size(mymatrix));
for i=1:length(mymatrix)
    for j=1:length(mymatrix) % Here it assumes the matrix is a square
        mymatrix_new(i,j,:) = wdenoise(squeeze(mymatrix(i,j,:)));
    end
end

推荐阅读