web-dev-qa-db-ja.com

GNUマトリックスの各アイテムを操作するOctaveメソッド。octave "arrayfun(...)"の例

GNU Octaveバージョン3.4.3では、カスタム関数を適用してマトリックスの各アイテム/要素を操作するのに問題があります。

次のような(2,3)行列があります。

mymatrix = [1,2,3;4,5,6];

mymatrix

   1   2   3
   4   5   6

マトリックスの各要素を入力として使用し、それに対してカスタム関数を実行し、関数の出力でmymatrixのコンテンツをアイテムごとに置き換えます。

38
Eric Leschinski

より簡単な方法は、Nasserが指摘したように、次のオクターブコードです。

f=@(x) x+5;
A = [1, 0, -1; 3, 4, 5];
result = f(A)
result

渡されたすべての要素に(x + 5)を適用し、出力します:

result =
    6    5    4
    8    9   10
2
Eric Leschinski

arrayfun はこれに適しています:

_arrayfun(@(x) 1/(1+e^(-x)), [0, 1; 2, 3])
_

出力:

_ans =

   0.50000   0.73106
   0.88080   0.95257
_

これは基本的に、行列/ベクトルの各要素に対して関数1/(1+e^(-x))を実行します。

67
Nikita G.

または、次のような要素ごとの演算子を使用できます(ドットプレフィックスに注意してください)。

  • 。+
  • .-
  • ./
  • e。^

例えば

mymatrix = 1 ./ (1 .+ e.^(-mymatrix));
21
frhack

このコードを「myfun.m」というファイル名に入れます

function [ out ] = myfun(num)
  out = num + 5;
end

このコードを「main.m」というファイル名に入れます

arrayfun(@myfun, [1, 0, -1; 3, 4, 5] )

出力:

ans =
   6   5   4
   8   9   10

手順(追加5)がマトリックスの各項目にどのように適用されたかに注目してください。

PROTIP:十分に大きなマトリックス上のこのコードがクアッドコアCPUを最大限に活用できない理由

以下は、ベクトル化の観点から低レベルCまでのarrayfunの機能の分析です。ベアメタル上のマルチコアおよびマルチスレッドの最適化にまっすぐにダウンします。

このarrayfunコードは「ベクトル化」されており、GNU Octaveは、GNU Octaveは独自の氷河期の反復を管理します。上記のようなベクトル化された方法で実行される操作は、これをforループに置く場合よりも2桁から5桁速くなります。このようなベクトル化されたコードは通常、通常のタスクには十分ですが、 AlienwareのQUAD-CHIP 32コアハイパースレッドCPUからすべての馬力を抽出することは、ミッションクリティカルです。

このコードは「マルチスレッド」または「マルチコア」ではないので、間違えないでください。 Cコードは引き続き、このコードを反復的な先入れ先出しキューのような方法で処理しています。 4番目の追加は3番目を待ち、3番目は2番目を待つ必要があります。このイテレーションが発生している間、CPUは親指をいじっています。この操作の実行中に、16コアのCPUを机の下に置いてCPU使用率を100%にしたい場合、回避策はありません。この問題を停止し、マルチスレッドおよびマルチコア指向でこの問題を再定義する必要があります。仕方。マルチスレッドとマルチコアはこの回答の範囲を超えています。最も簡単な方法は、オクターブコードを定義して、同時に実行される8つの別々の並列job1.mからjob8.mファイルを生成することです。それらのすべてが手元のタスクの1/8を処理し、最後にすべてが完了するのを待ってから、回答に再び参加します。 GNUここでのオクターブベクトル化は、マルチスレッドダウンメタルとは異なります。

7
Eric Leschinski