0

私がすでに尋ねた質問をフォローアップし、これが解決されたものから新しい問題が生じたという事実にもかかわらず、私の質問に対する答えが得られた限り解決しました:

Complex APIを使用する際の問題は、 NMatrix APIの shape メソッドを認識しないことです。

したがって、コンパイル済みの C 拡張機能で次の仕様コードを実行すると、次のようになります。

  it "Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument" do
    n = NMatrix.new([4], [3.10, 1.73, 1.04, 2.83])

    r = FFTW.Z(n)
    i = FFTW.Z(FFTW.r2c_one(r))
    #expect(fftw).to eq(fftw)
  end

shape は nmatrix クラスに属しているため、エラーが発生します。

 FFTW Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument
     Failure/Error: i = FFTW.Z(FFTW.r2c_one(r))
     NoMethodError:
       undefined method `shape' for NMatrix:Class
     # ./spec/fftw_spec.rb:26:in `r2c_one'
     # ./spec/fftw_spec.rb:26:in `block (2 levels) in <top (required)>'

Shape は nmatrix クラスから呼び出されるため、なぜこれが起こったのかは理解できますが、それを回避する方法はわかりません。

結果として

  it "Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument" do
    n = NMatrix.new([4], [3.10, 1.73, 1.04, 2.83])

    fftw = FFTW.Z(n)
    expect(fftw).to eq(fftw)
  end

/home/magpie/.rvm/rubies/ruby-2.1.2/bin/ruby -I/home/magpie/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.4/lib:/home/magpie/.rvm/gems/ruby-2.1.2/gems/rspec-support-3.0.4/lib -S /home/magpie/.rvm/gems/ruby-2.1.2/gems/rspec-core-3.0.4/exe/rspec ./spec/fftw_spec.rb
./lib/fftw/fftw.so found!

FFTW
  creates an NMatrix object
  Fills dense with individual assignments
  Creates a new FFTW.r2c object and takes an a 1D NMatrix as its argument

Finished in 0.00091 seconds (files took 0.07199 seconds to load)
3 examples, 0 failures
4

1 に答える 1

2

問題はfftw.cppのこのコードの塊だと思います

51 ~ 56 行目:

static VALUE
fftw_shape(VALUE self)
{
  // shape is a ruby array, e.g. [2, 2] for a 2x2 matrix
  return rb_funcall(cNMatrix, rb_intern("shape"), 0);
}

ここで NMatrix クラスの shape を呼び出そうとしています。rb_funcall次のように動作します:

rb_funcall(object_to_invoke_method, method_to_invoke, number_of_args, ...)

問題は、最初の引数の位置にあるため、メソッドをオブジェクトではなくクラスcNMatrixに送信しようとしていることです。したがって、次のように nmatrix オブジェクトで実際に呼び出したいと考えています。shapeNMatrix

static VALUE
fftw_shape(VALUE self, VALUE nmatrix)
{
  // shape is a ruby array, e.g. [2, 2] for a 2x2 matrix
  return rb_funcall(nmatrix, rb_intern("shape"), 0);
}

そして82行目:

VALUE shape = fftw_shape(self, nmatrix);

それは役に立ちますか?唯一の問題は、あなたがshapeクラスを呼び出していることだと思いますが、何か他のことが起こるかもしれません.

于 2014-08-25T19:01:22.387 に答える