0

Octave / Matlab で多次元行列 A が与えられた場合、

すべての要素が k 番目の次元に沿ったインデックスに置き換えられる A と同じサイズの行列を取得する最も簡単な方法は何ですか?

つまり、行列の場合

A =

ans(:,:,1) =

   0.095287   0.191905
   0.226278   0.749100

ans(:,:,2) =

   0.076826   0.131639
   0.862747   0.699016

f(A,1) = となるような関数 f が欲しい

ans(:,:,1) =

   1   1
   2   2

ans(:,:,2) =

   1   1
   2   2

f(A,2) =

ans(:,:,1) =

   1   2
   1   2

ans(:,:,2) =

   1   2
   1   2

f(A, 3) =

ans(:,:,1) =

   1   1
   1   1

ans(:,:,2) =

   2   2
   2   2

また、与えられた疎行列 B

ゼロ以外の要素が k 番目の次元に沿ったインデックスに置き換えられた、同じサイズの別のスパース行列を取得する最も簡単な方法は何ですか? (上記と同じ問題ですが、非ゼロ要素のみ)

理想的には、オクターブ用に適切にベクトル化された方法を探しています (つまり、何も明示的にループしないことを意味します)。

明確化:疎行列の場合、どの時点でもフルサイズ(B)の行列を作成する必要のない解決策を探しています

4

2 に答える 2

2

ndgrid()探している形式ではありませんが、必要なことを行います。入力 A の次元が事前にわかっている場合は、次の行を使用して N 次元メッシュ グリッドを作成できます。

% for matrix a where ndims(a) == 3
[x, y, z] = ndgrid (1:size(a,1), 1:size(a,2), 1:size(a,3));
% x is like f(a, 1)
% y is like f(a, 2)
% z is like f(a, 3)

ndgrid() の周りにカスタム ラッパーを記述して、探している関数形式に変換できる場合があります。

于 2013-05-19T03:12:09.163 に答える
0

私はndgridについて知らなかったので、誰かが興味を持っている場合に備えて、私が思いついた答えは次のとおりです。

function [y] = indices(a,k)
    s = size(a);
    n = s(k);
    D = length(s);
    x = permute(a,[k,1:(k-1),(k+1):D]);

    y = reshape(x,n,[]);
    y = diag(1:n) * ones(size(y));
    y = reshape(y,size(x));

    y = permute(y,[(2:k),1,(k+1):D]);
endfunction

function [y] = spindices(a,k)
    s = size(a);
    n = s(k);
    D = length(s);
    x = permute(a,[k,1:(k-1),(k+1):D]);

    y = reshape(x,n,[]);
    y = spdiag(1:n) * spones(y);
    y = reshape(y,size(x));

    y = permute(y,[(2:k),1,(k+1):D]);
endfunction
于 2013-05-19T03:25:26.113 に答える