web-dev-qa-db-ja.com

ベクトルを行列のインデックスとして使用する

データをn次元配列(可変次元サイズ)に読み取るためのMATLAB関数を作成しています。マトリックス内の特定のポイントにアクセスできるようにする必要があります(たとえば、書き込むまたは読み取るために)が、事前に指定するインデックスの数がわかりません。

現在、各インデックスを指定するために繰り返し処理する_current_point_ベクトルと、配列のサイズを指定する_max_points_ベクトルがあります。したがって、たとえば、サイズが1000 x 15 x 3の3次元配列が必要な場合、_max_points = [1000 15 3]_と_current_point_は_[1, 1, 1]_から_[1000, 15, 3]_( _[1, 1, 1]_-> _[1000, 1, 1]_-> _[1, 2, 1]_-> _[1000, 2, 1]_-> ...)私ができるようにしたいのは、次のように_current_point_をインデックスとしてマトリックスにフィードすることです:

_output_matrix(current_point) = val
_

しかし、明らかにoutput_matrix([1 2 3]) = valのようなものはoutputmatrix(1:3) = 30を設定するだけです。行列が3つのインデックスを必要とする場合もあれば、4、その他の場合は2などを必要とする場合があるため、ダミー変数を使用することはできません。可変長のベクトルが実際に必要です。インデックスのポイントとしてベクトルを使用する簡単な方法はありますか?

16
Paul

この _sub2ind_ を使用して linear index を作成することは、この 密接に関連する質問 。 _sub2ind_を呼び出す代わりに、 線形インデックスを自分で計算する こともできます。

ただし、あなたのケースは、私がリンクした他の質問のケースよりも単純な場合があります。 singleポイントを_current_point_ベクトルでインデックス付けしている場合(つまり、nへの添え字のn要素ベクトルのみ) -次元行列)、次に、関数 _current_point_ を使用して_num2cell_を添え字のセル配列に変換し、それを使用する単純なソリューションを使用できますインデックスの コンマ区切りリスト を作成します。例えば:

_current_point = [1 2 3 ...];        % A 1-by-n array of subscripts
subCell = num2cell(current_point);  % A 1-by-n cell array of subscripts
output_matrix(subCell{:}) = val;    % Update the matrix point
_

操作_subCell{:}_は、タイプ__subCell{1}, subCell{2}, ..._と同等の機能を作成します。これは、タイプcurrent_point(1), current_point(2), ...と同等です。

20
gnovice

遅すぎるのはわかっていますが、このトピックを見つける人にとっては。私にとって最も簡単な方法は、以下を使用することです。diag(A (x(:),y(:)) );

残念ながらこれは、値を変更するためではなく、マトリックスから値を取得する必要がある場合にのみ機能します

10
Pavel

_sub2ind_ 関数を使用して、添字から線形インデックスを取得できます。

例:

_A=magic(4)

A =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

selectElement={2,3}; %# get the element at position 2,3 in A.
indx=sub2ind(size(A),selectElement{:});
A(indx)

ans =

    10
_

上記の例では、下付き文字(次元はいくつでもかまいません)をcellとして保存しています。それをベクトルとして格納している場合は、単純に num2cell() を使用してセルに変換します。

これに、A(indx)=value;として値を簡単に割り当てることができます。答えを一般的にするために、私はあなたとは異なる変数を使用しましたが、考え方は同じであり、変数名を置き換えるだけで済みます。

また、投稿で、_(1,1,1)_から_(1000,15,3)_の値までループし、これらの各ポイントに値を割り当てることについても言及しました。列に沿ってループしている場合は、この操作全体をベクトル化されたソリューションに置き換えることができます。

_finalElement={1000,15,3}_をループの最後のステップにします。前と同じように、線形インデックスを次のように見つけます。

_index=sub2ind(size(A),finalElement{:});
_

ループで割り当てる値が単一のベクトルvaluesとして格納されている場合は、次のように単一のステップで単純に割り当てることができます。

_A(1:index)=values;
_
4
abcd