在矩阵上执行了平滑功能,但是现在只有匹配的索引才给出值

时间:2019-07-03 20:19:45

标签: matlab

我有一个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索引不相同时,某些非零元素却显示为零。

1 个答案:

答案 0 :(得分:2)

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

如果您看一下foor循环:

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循环,以便更新ij的所有组合

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