10

固定されていない次元行列Mがあり、そこから単一の要素にアクセスします。要素のインデックスはベクトルJに含まれています。

したがって、たとえば:

M = rand(6,4,8,2);
J = [5 2 7 1];

output = M(5,2,7,1)

今回のMは4次元ですが、事前にはわかりません。これは、私が書いているアルゴリズムの設定に依存します。同様にそれは可能性があります

M = rand(6,4);
J = [3 1];

output = M(3,1)

だから私は単純に使うことはできません

output=M(J(1),J(2))

sub2indを使用することを考えていましたが、これにも変数をコンマで区切る必要があります。

@gnovice

Mこれは機能しますが、マトリックスからのこの種の要素抽出をかなり多く使用するつもりです。したがって、cellJアクセスするたびに一時変数を作成する必要がある場合M、これにより計算が大幅に遅くなりませんか?

別の関数を書くこともできます

function x= getM(M,J)
    x=M(J(1),J(2));
    % M doesn't change in this function, so no mem copy needed = passed by reference
end

これをアルゴリズムのさまざまな構成に適合させます。もちろん、これは私が質問に含めなかった速度と柔軟性の考慮事項です。

ただし、これは要素を取得する場合にのみ使用できます。設定する場合は、実際にインデックス(およびできれば線形インデックス)を使用する以外に方法はありません。私はまだsub2indがオプションだと思います。私が意図した最終結果は次のようなものでした。

function idx = getLinearIdx(J, size_M)
    idx = ...
end

結果:

function lin_idx = Lidx_ml( J, M )%#eml
%LIDX_ML converts an array of indices J for a multidimensional array M to
%linear indices, directly useable on M
%
% INPUT
%   J       NxP matrix containing P sets of N indices
%   M       A example matrix, with same size as on which the indices in J
%           will be applicable.
%
% OUTPUT
%   lin_idx Px1 array of linear indices
%

% method 1
%lin_idx = zeros(size(J,2),1);
%for ii = 1:size(J,2)
%    cellJ = num2cell(J(:,ii)); 
%    lin_idx(ii) = sub2ind(size(M),cellJ{:}); 
%end

% method 2
sizeM = size(M);
J(2:end,:) = J(2:end,:)-1;
lin_idx = cumprod([1 sizeM(1:end-1)])*J;

end

方法2は、方法1よりも20(=P変換するインデックスセット()の数が少ない)から80(インデックスセット(=P)の数が多い)の倍の速さです。簡単な選択

4

2 に答える 2

12

J任意の長さにすることができる一般的なケース(私は常にの次元の数と一致すると思いMます)には、いくつかのオプションがあります。

  1. 関数Jを使用してセル配列のセルにの各エントリを配置し、コロン演算子を使用してこのセル配列からコンマ区切りのリストを作成できます。num2cell

    cellJ = num2cell(J);
    output = M(cellJ{:});
    
  2. sub2ind関数を回避して、少しの計算で線形インデックスを自分で計算できます。

    sizeM = size(M);
    index = cumprod([1 sizeM(1:end-1)]) * (J(:) - [0; ones(numel(J)-1, 1)]);
    output = M(index);
    
于 2012-04-13T18:28:05.740 に答える
0

これは、下付き文字のマトリックス全体を処理できるgnovicesオプション2)のバージョンであり、各行には1つの下付き文字が含まれています。例:3つの添え字:

J = [5 2 7 1 
     1 5 2 7
     4 3 9 2];

sizeM = size(M);
idx = cumprod([1 sizeX(1:end-1)])*(J - [zeros(size(J,1),1) ones(size(J,1),size(J,2)-1)]).';
于 2017-07-19T20:32:05.737 に答える