【问题标题】:speed of FFT Jtransformation vs MATLABFFT Jtransformation与MATLAB的速度
【发布时间】:2012-10-24 15:34:56
【问题描述】:

我在 JTransfroms 中有关于 {1850 000,1} 元素的向量.. 但日志:

exception in thread "main" java.lang.OutOfMemoryError: Java heap space 1350 000

它有效......但仍然需要大约 1 分钟!它对我来说太多了..有线程.. 在matlab中大约需要2秒。在Jtrans的官网上。

:limitations: 非二次幂大小的一维变换是连续的 (当使用混合基数时)。 2 次幂大小的一维变换 只能使用 2 或 4 个线程。

线程数必须是二的幂数。

谁能解释一下什么是二次方大小?

【问题讨论】:

    标签: java matlab fft


    【解决方案1】:

    2 的幂是(在计算机如此存在的情况下)只有因子 2 的数字。即 2、4、8、16、...、1024 2048 等。因此,如果您使用正好为 1024 的向量作为输入数字,它应该会更快。

    我真的不知道您所说的“大约 {1850 000,1} 个元素”是什么意思,尽管您的数字可能要高得多?该库显然不会使用超过 4 个线程(无论如何在许多系统上不会做太多事情),因此您不应该获得太多的速度增益。可能还有其他问题。

    【讨论】:

    • 谢谢,我有这个数字 1843200 是它的二的幂 :) 当我用同一个对象调用方法时,它的 myabye 问题
    • @LukasTheBoss:1843200 不是 2 的幂(因为您可以将其除以 5(最后一位是零))。如果可以的话,你应该使用 FFT(在任何库中),它的元素数量是纯 2 的幂:它简化了计算并因此加快了计算速度。
    【解决方案2】:

    我将发布一些 FFT 的背景知识来解释 radix-2 的限制。

    首先要注意的是,大多数 FFT 实现都使用 C-T FFT Algorithm. 这通过将 FFT 拆分为越来越小的 FFT 来工作,就像合并排序首先将排序限制为基本情况。

    C-T 算法最常用的方式是将问题分成一半 (N = N0 / 2)。这并不是说混合基数的情况是不可能的,但是由于以下原因,“二的幂”的情况是最有效的,因此也是最常用的。

    现在大多数 FFT 实现的主要瓶颈不是算法的实现,而是硬件 - 处理器管道等等。显然,这些都建立在二进制逻辑基础之上,导致带宽几乎完全是 2N

    因此,由于寄存器中的精确拟合和原始问题的精确细分,在内存中使用 2N 个字节的 FFT 将被更快地计算。

    TL;DR:用不相关的数据 (0) 填充 FFT 向量,直到它达到最接近 2 的幂。然后只使用有效的结果数据。

    但是,您的异常似乎只是内存不足。您使用的是 32 位操作系统吗?如果是这样,您的大型操作可能会超出分配的 2GB 进程内存或其他限制。

    【讨论】:

    • @LukasTheBoss 在这种情况下你更有可能遇到错误。我不是 Android 专家,但我确信通常的 2GB 寻址限制已大大降低,并且内存管理更加严格。但是,我认为 Java 分配的 1.3MB 在这里应该不是问题。所以我想我的新问题是你的问题到底是什么?它清楚地表明选择 2 或 4 个线程来运行,我们已经解释了为什么你的 FFT 应该是 2 的幂。您遇到了什么错误/问题?
    • 当我有大小为 1 843 200 的输入向量时它很有趣,它的工作速度非常快,但是当我尝试这个并且我需要这个时:1 843 200+2 它会抛出相同的错误:线程“main”中的异常" java.lang.OutOfMemoryError: Java 堆空间在 edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D.bluestein_real_forward(Unknown Source) at edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D.realForward(Unknown Source)
    • 当我尝试 1843 200+1 错误时,当我尝试 1 843 120 错误时...相同
    • @LukasTheBoss 这很奇怪。我怀疑某种类型的内存分配错误源于算法试图自动将数组填充到方便的数字。如果您正在为 android 开发这个,这是否可以在 android 测试环境之外工作?也就是说,使用宽松的记忆准则?
    • 我只需要真正的元素和拳头 0.05 的最高百分比。
    猜你喜欢
    • 2012-06-04
    • 2012-10-14
    • 2013-02-24
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多