4

MATLAB では、1D の場合、 などのインデックス付きの要素を選択してa([1 5 3])、a の 1 番目、5 番目、3 番目の要素を返すことができることを知っています。私は 2D 配列を持っており、私が持っている一連のタプルに従って個々の要素を選択したいと考えています。だから私は取得したいと思うかもしれませんa(1,3), a(1,4), a(2,5)。現在、私が持っている最高のものは ですがdiag(a(tuples(:,1), tuples(:,2))、これには、より大きな a および/またはタプルに対して法外な量のメモリが必要です。これらのタプルを線形インデックスに変換する必要がありますか、またはメモリをあまり消費せずに目的を達成するためのよりクリーンな方法はありますか?

4

3 に答える 3

6

線形インデックスへの変換は、正当な方法のように思えます。

indices = tuples(:, 1) + size(a,1)*(tuples(:,2)-1);
selection = a(indices);

sub2indnate'2 answer のように、これは Matlab 組み込みソリューションにも実装されていることに注意してください。

a(sub2ind(size(a), tuples(:,1),tuples(:,2)))

でも、

a = rand(50);
tuples = [1,1; 1,4; 2,5];

start = tic;
for ii = 1:1e4
    indices = tuples(:,1) + size(a,1)*(tuples(:,2)-1); end
time1 = toc(start);


start = tic;
for ii = 1:1e4
    sub2ind(size(a),tuples(:,1),tuples(:,2)); end
time2 = toc(start);

round(time2/time1)

を与える

ans =   
    38

そのためsub2ind、目にはやさしいですが、最大 40 倍も遅くなります。この操作を頻繁に行う必要がある場合は、上記の方法を選択してください。sub2indそれ以外の場合は、読みやすさを向上させるために使用します。

于 2012-10-23T05:25:00.987 に答える
3

x と y が行列 a の xy 値のベクトルである場合、sub2und は問題を解決するはずです。

a(sub2ind(size(a),x,y))

例えば

a=マジック(3)

a =

 8     1     6
 3     5     7
 4     9     2
x = [3 1];
y = [1 2];


a(sub2ind(size(a),x,y))

ans =

 4     1
于 2012-10-23T05:35:39.230 に答える
0

次のように、1D 番号で 2D matlab 位置を参照できます。

a = [3 4 5;
     6 7 8;
     9 10 11;];
a(1) = 3;
a(2) = 6;
a(6) = 10;

したがって、次のようなマトリックスで位置を取得できる場合:

a([(col1-1)*(rowMax)+row1, (col2-1)*(rowMax)+row2, (col3-1)*(rowMax)+row3])

注: この場合、rowmax は 3 です

col1/row1 col2/row2 および col3/row3 の要素のリストが表示されます。

もしそうなら

row1 = col1 = 1
row2 = col2 = 2
row3 = col3 = 3

あなたが得るでしょう:

[3, 7, 11]

戻る。

于 2012-10-23T05:38:24.930 に答える