データを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などを必要とする場合があるため、ダミー変数を使用することはできません。可変長のベクトルが実際に必要です。インデックスのポイントとしてベクトルを使用する簡単な方法はありますか?
この _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), ...
と同等です。
遅すぎるのはわかっていますが、このトピックを見つける人にとっては。私にとって最も簡単な方法は、以下を使用することです。diag(A (x(:),y(:)) )
;
残念ながらこれは、値を変更するためではなく、マトリックスから値を取得する必要がある場合にのみ機能します
_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;
_