我有一个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索引不相同时,某些非零元素却显示为零。
答案 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循环,以便更新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