こんにちは、サイズ [xyz] の 3 次元オクターブ配列 A があります。
今、次元 n * 3 の別の配列 B があります
B(0) が [3 3 1] を与えるとします。
A のその場所にアクセスする必要があります。つまり、A(3, 3, 1) = A(B(0)) のような 15 とします。
どうすればいいですか?
こんにちは、サイズ [xyz] の 3 次元オクターブ配列 A があります。
今、次元 n * 3 の別の配列 B があります
B(0) が [3 3 1] を与えるとします。
A のその場所にアクセスする必要があります。つまり、A(3, 3, 1) = A(B(0)) のような 15 とします。
どうすればいいですか?
まず、B(0)
MATLABとOctaveでのアドレス指定は1から始まるため、無効なインデックスです。他の問題はB(0)
、ベクトルを含める必要があることです[3 3 1 ]
。MATLABの行列には、他の行列を含めることはできず、スカラーのみを含めることができます。したがって、3x3セル配列、3x3構造体、または4次元配列を使用する必要があります。ここでは、セル配列オプションを選択します。これは、最も簡単で便利だと思うからです。
%ランダムシードを設定します(データ生成などにのみ使用されます)。
rng(123456789);
%いくつかの疑似ランダムサンプルデータを生成してみましょう。
A = rand(3,3,3);
A(:,:,1) =
0.5328 0.7136 0.8839
0.5341 0.2570 0.1549
0.5096 0.7527 0.6705
A(:,:,2) =
0.6434 0.8185 0.2308
0.7236 0.0979 0.0123
0.7487 0.0036 0.3535
A(:,:,3) =
0.1853 0.8994 0.9803
0.7928 0.3154 0.5421
0.6122 0.4067 0.2423
%疑似ランダム1x3インデックスベクトルで満たされたインデックスのサンプル3x3x3セル配列を生成します。
CellArrayOfIndicesB = cellfun(@(x) randi(3,1,3), num2cell(zeros(3,3,3)), 'UniformOutput', false);
%例1。座標(1,2,3)。
Dim1 = 1;
Dim2 = 2;
Dim3 = 3;
%Aの対応する値を直接取得するコード。
ValueOfA = A(CellArrayOfIndicesB{Dim1,Dim2,Dim3}(1), CellArrayOfIndicesB{Dim1,Dim2,Dim3}(2), CellArrayOfIndicesB{Dim1,Dim2,Dim3}(3));
ValueOfA =
0.8839
%最初にCellArrayOfIndicesB{1,2,3}が指す場所を確認して確認しましょう。
CellArrayOfIndicesB{1,2,3}
ans =
[ 1 3 1 ]
%CellArrayOfIndicesB{1,2,3}
はを指しA(1,3,1)
ます。%では、の値を見てみましょうA(1,3,1)
。
A(1,3,1)
ans =
0.8839
%例2。座標(3,1,2)。
Dim1 = 3;
Dim2 = 1;
Dim3 = 2;
ValueOfA = A(CellArrayOfIndicesB{Dim1,Dim2,Dim3}(1), CellArrayOfIndicesB{Dim1,Dim2,Dim3}(2), CellArrayOfIndicesB{Dim1,Dim2,Dim3}(3));
ValueOfA =
0.4067
CellArrayOfIndicesB{3,1,2}
ans =
[ 3 2 3 ]
A(3,2,3)
ans =
0.4067
sub2ind
(および)のヘルプを参照してくださいind2sub
。ただし、最近ではループの使用が推奨されています。