1

上記の変数で上記のループを実行しています。

  • A はサイズ mxn の 2 次元配列です。
  • mask は、サイズが 1xn の 1 次元論理配列です。
  • 結果はサイズ 1xn の 1 次元配列です
  • B は mx1 形式のベクトルです。
  • C は mxm 行列で、m は上記と同じです。

編集: foo(x) を関数に展開しました。

コードは次のとおりです。

temp = (B.'*C*B);    
for k = 1:n
    x = A(:,k);
    if(mask(k) == 1)
        result(k) = (B.'*C*x)^2 / (temp*(x.'*C*x)); %returns scalar
    end
end

注意してください、私はすでに上記のコードを for ではなく parfor ループとして使用しています。メッシュグリッドまたはソートを使用してパフォーマンスを向上させる方法を提案できることを願っていました。RAMに問題があるとは思わないので、解決策はメモリに関しても高価になる可能性があります。

どうもありがとう。

4

2 に答える 2

1

これを試して:

 result=(B.'*C*A).^2./diag(temp*(A.'*C*A))'.*mask;

行列乗算によるこのベクトル化resultは、1xn ベクトルであることも確認します。あなたが提供したコードでは、最後の要素maskがゼロの場合があります。この場合、コードはより短い長さに切り捨てられますがresult、答えではこれらの要素をゼロに保ちます。

于 2013-10-29T21:39:53.397 に答える
1

fooマトリックス入力を許可する場合は、次のことができます。

result = zeros(1,n); % preallocate result with zeros
mask = logical(mask); % make mask logical type
result(mask) = foo(A(mask),:); % compute foo for all selected columns
于 2013-10-29T15:23:54.223 に答える