0

たとえば、2x4 マトリックスを取り込んで 2x1 マトリックスを出力するなど、かなり些細なことを行う関数 (GetDepth) を定義しました。次に、それを適用したい2x4xnマトリックスがあり、2x1xnマトリックスの結果を期待しています。

ループを使用せずに関数を行列に適用する正しい構文は何ですか?

編。要求に応じて、これが私がやろうとしていることの例です:

function [bidWSize, askWSize] = getWSizes(m, bookSizeHistory)
    bidWSize = sum(bookSizeHistory(2:4, 1, m));
    askWSize = sum(bookSizeHistory(2:4, 2, m));
end

現在、ループして2x1xn出力にフィードしています

4

2 に答える 2

3

nx2x4 の行列を処理できるように関数を作成する必要があります。本当に些細なことをするのであれば、それほど難しくはないはずです。問題がある場合は、ここに投稿して助けを求めることができます。

編集:

sum は行列でうまく機能する関数であるため、行列を合計して次元をいじるだけで、目的を達成できます。関数はまったく必要ありません。

sum(bookSizeHistory(2:4, 1:2, :))

は 1 次元の合計 (関数で行うことと同様) であるため、bookSizeHistoryのサイズが Kx2xN であると仮定すると、この合計の出力は 1x2xN になります。並べ替えを追加して、必要に応じてディメンションを再配置できます。

permute(sum(bookSizeHistory(2:4, 1:2, :)), [2 1 3])

必要なものを与える必要があります。

于 2010-02-10T18:06:55.480 に答える
1

「.」を使用して、個々の要素に対して機能を実行できます。オペレーター。たとえば、各要素をある程度の力にするには、次のようにします。

C=A.^B;

それ以外の:

[rows,cols]=size(A);
for i=1:rows
    for j=1:cols
        C=A(i,j)^B;
    end
end

これにより、同じ結果のループよりもはるかに短いコードが得られます。これは通常、BLAS 関数を利用する「ベクトル化された」コードと呼ばれます。それ以外の場合、Matlab はインタープリター言語に似ており、はるかに低速です。他の関数は、配列内のすべての行または列に対して操作を実行します。A が 2 次元配列 (2,4) の場合、sum(A) は各列の合計を返します。合計は、いくつかの異なる方法で見つけることができます。

A_temp=reshape(A,[1,8]);
B=sum(A_temp);

また

A=sum(sum(A));

sum コマンドには、追加の引数を指定した 1 回の呼び出しでこれを実行できる機能が他にもあるかもしれませんが、それでもかなり高速な方法です。

于 2010-02-10T23:18:50.760 に答える