46

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

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

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

mymatrix

   1   2   3
   4   5   6

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

4

4 に答える 4

7

このコードを「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 が限界に達しないのはなぜですか。

以下は、arrayfunベクトル化の観点からローレベル C までの の機能を分析したものです。ベア メタルでのマルチコアおよびマルチスレッドの最適化に直行します。

このarrayfunコードは「ベクトル化」されており、GNU Octave はこのコードをパッケージ化して、GNU Octave が独自の氷河期反復を管理するのではなく、事前に最適化された C コードに渡されるようにします。上記のようなベクトル化された方法で実行される操作は、これを 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 オクターブ ベクトル化は、金属上のマルチスレッド化とは異なります。

于 2012-07-08T21:28:27.933 に答える
1

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

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

渡されたすべての要素に (x+5) を適用すると、次のように出力されます。

result =
    6    5    4
    8    9   10
于 2012-07-17T13:55:47.463 に答える