0

オクターブには、2 次元行列のすべての列に適用される関数を取り、それを n 次元行列の k 次元に沿ったすべての行に適用される関数に変換する方法がありますか?

例として、最小値が 0 で最大値が 1 になるように、行列のすべての列をスケーリングする関数があります。

function [res] = normalizeColRange(m)
    nrows = size(m,1);

    maxes = max(m,[],1);
    mins = min(m,[],1);

    res = [speye(nrows), -ones(nrows,1)] * [m; mins] / diag(maxes - mins);
endfunction

今、関数 (operateDim と呼びます) を探しているので、同じ方法で 4 次元マトリックス (m) のすべての dim-3 ラインをスケーリングしたい場合は、次のように言えます。

res = operateDim(@normalizeColRange,m,3);

すべてのエントリが次元 3 に沿ってスケーリングされている、同じサイズの 4 次元行列を取得します。つまり、次のようになります。

min(res,[],3) == 0

max(res,[],3) == 1

より単純な入力関数は、単に行列の乗算です。すなわち:

res = operateDim(@(M) A * M, m, 3)

は、m の各 d-3 行を行列の列として扱い、A にその列を適切に掛けて、次のようにします。

reshape(permute(res,[3,1,2,4]),size(res,3),[]) ==
A * reshape(permute(m,[3,1,2,4]),size(m,3),[])
4

1 に答える 1

0

これは、operateDim を作成する私の試みです。やや冗長に思えますが、より一般的なパラダイムに当てはまるのか、それともオクターブ ライブラリにそのような関数が既に存在するのか疑問に思います。

function [res] = operateDim(f,m,d):
    p = 1:ndims(m);
    p([1,d]) = [d,1];
    m = permute(m, p);
    nsizes = size(m);
    m = reshape(m, nsizes(1), []);
    res = f(m);
    assert(ndims(res) <= 2);
    nsizes(1) = size(res,1);
    assert(size(res,2) == size(m,2));
    res = reshape(res, nsizes);
    res = permute(res, p);
endfunction
于 2013-07-10T01:24:02.123 に答える