Matlab length函数转Python获取数组整数长度的实现问题
Matlab
length 函数转Python的正确实现 对应转写场景
需要转写的Matlab代码片段:
d = real(ifft(fft(fw) .* conj(fft(rv)))) d = [d(ld+1:length(d)) d(1:ld)]'
转写卡点:需要把ld = length(d)的逻辑用Python实现,要求返回整数类型。之前尝试的np.size(d, 1)、np.prod(d.shape)两种写法,返回值都不符合整数类型预期。
过往写法的问题根源
Matlab中length()的定义是:对任意数组,返回数组所有维度中最大的维度长度,对一维数组而言等价于返回元素总个数,结果为标量整数。
之前两种写法的偏差点:
np.size(d, 1):仅对二维数组有效,当d是FFT输出的一维数组时,指定轴参数会触发维度索引错误,返回值不符合预期np.prod(d.shape):虽然可以计算总元素数,但返回值是NumPy数值类型,且计算逻辑是总元素个数,和Matlablength取最大维度值的规则不匹配
可直接使用的正确实现
一维数组场景(当前FFT代码的适配场景)
当前代码中的d是ifft输出的一维数组,直接用Python内置len()即可,返回值为Python原生整数,和Matlablength的行为完全对齐:
import numpy as np # 对应Matlab的实数化逆傅里叶计算逻辑 d = np.fft.ifft(np.fft.fft(fw) * np.conj(np.fft.fft(rv))).real # 对应Matlab的 ld = length(d),返回原生整数 ld = len(d)
该写法无额外类型转换开销,运行效率和Matlab原生length接近
全场景对齐Matlablength的通用函数
如果需要适配任意维度的数组,1:1复刻Matlablength取最大维度长度的规则,可以使用如下函数,返回值同样为Python原生整数:
def matlab_length(arr): return max(arr.shape)
配套代码转写参考
原Matlab代码中循环移位的拼接逻辑,对应Python实现为:
# 对应Matlab的 [d(ld+1:length(d)) d(1:ld)]' 拼接转置 d = np.concatenate((d[ld:], d[:ld])).reshape(-1, 1)
内容的提问来源于stack exchange,提问作者Folkert
相关产品推荐
相关产品推荐

