1

こんにちは、サイズ [xyz] の 3 次元オクターブ配列 A があります。

今、次元 n * 3 の別の配列 B があります

B(0) が [3 3 1] を与えるとします。

A のその場所にアクセスする必要があります。つまり、A(3, 3, 1) = A(B(0)) のような 15 とします。

どうすればいいですか?

4

2 に答える 2

0

まず、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
于 2012-04-17T20:54:30.830 に答える
0

sub2ind(および)のヘルプを参照してくださいind2sub。ただし、最近ではループの使用が推奨されています。

于 2012-04-17T19:19:52.507 に答える