我需要在MATLAB中转换以下嵌套的Python for循环,但它不起作用。
for ii in where(obs != 0)[0]:
ob = obs[ii]
ncount = int(floor(top / ob))
for jj in range(ncount):
l_ind = max(int(floor((ob * (jj + 1) - width / 2.) / top * (G - 1))), 0)
h_ind = min(int(ceil((ob * (jj + 1) + width / 2.) / top * (G - 1))), G - 1)
ret[ii, l_ind : h_ind + 1] = tukey(h_ind - l_ind + 1, 0.5)
我个人不需要"where(obs!=0([0]"部分,因为我的obs向量在该维度上没有零。到目前为止,我尝试了以下几种:
for ii = 1:length(obs)
ob = obs(ii);
ncount = floor(top / ob);
for jj = 1:ncount
l_ind = max(floor((ob * (jj + 1) - width / 2) / top * (G - 1)), 0);
h_ind = min(ceil((ob * (jj + 1) + width / 2) / top * (G - 1)), G - 1);
ret(ii , l_ind : h_ind) = tukeywin(h_ind - l_ind + 1)';
end
end
在Matlab中,tukey被称为tukeywin,我不需要额外的0.5参数,因为它是默认值。正如你所看到的,我还必须转置tukeywin,以匹配大小,否则会给我另一个错误,并从h_ind中删除+1,这可能是因为在Python中,索引从0开始,而在Matlab中,它从1开始。如果我保留+1,那么我必须在tukeywin函数中输入+2,以匹配等式两边的大小。
但在这之后,它仍然不起作用,我在生成ret矩阵的最后一行遇到了问题。ret矩阵用零初始化,大小为1972 x 1025。obs矢量的大小是1972×。G是1025,宽度是300,顶部是22050。例如,obs向量包含100-600之间的数字,因此您应该能够重新创建这个嵌套循环。
它给我一个错误">位置2的索引无效。数组索引必须是正整数或逻辑值"。我假设这是指ret(ii,l_ind:h_ind(部分,ii很好,它将一直持续到1972年,但我认为l_ind:h_ind给了我错误。所以我不知道如何在Matlab中构造它。
在没有完全测试代码的情况下,我认为您的问题与基于0和1的数组索引有关。您正在将l_ind
和h_ind
限制为0和G-1。对于Matlab,您需要1和G.
我不太确定你在floor/ceil语句中做了什么来确定你的指数,但我怀疑逻辑需要调整一下。最简单的解决方案可能是仅+1l_ind
和h_ind
行。否则,您需要使用基于1的索引对它们进行返工。。。