2

いくつかのデータを入れ子構造に整理しました。これには、複数の被験者が含まれ、被験者ごとに 4 ~ 5 回の試行が行われ、身長、歩行サイクルにわたる関節トルクなどのデータが識別されます。たとえば、次のようになります。

subject(2).trial(4).torque

被験者 2 の 4 回目の試行の関節トルクの行列を示します。ここで、トルク行列の列は自由度 (腰、膝など) を表し、行は歩幅の 0 から 100% までの時間増分を表します。私がやりたいことは、自由度ごとに 5 回の試行の平均を取り、それを使用して (その自由度の) 被験者を表すことです。第 1 自由度に対して次のようにしようとすると、次のようになります。

for i = 2:24
    numTrialsThisSubject = size(subject(i).trial, 2);
    subject(i).torque = mean(subject(i).trial(1:numTrialsThisSubject).torque(:,1), 2);
end

次のエラーが表示されます。

??? Scalar index required for this type of multi-level indexing.

ネストされた for ループを使用して試行をループし、それらを一時行列に格納してから、一時列の平均を取得できることはわかっていますが、できれば一時行列用に別の変数を作成することは避けたいと思います。これは可能ですか?

4

2 に答える 2

1

deal()とを組み合わせて使用​​できますcell2mat()

これを試してください (組み込みのデバッガーを使用してコードを実行し、その動作を確認してください)。

for subject_k = 2:24
    % create temporary cell array for holding the matrices:
    temp_torques = cell(length(subject(subject_k).trial), 1);

    % deal the matrices from all the trials (copy to temp_torques):
    [temp_torques{:}] = deal(subject(subject_k).trial.torque);

    % convert to a matrix and concatenate all matrices over rows:
    temp_torques = cell2mat(temp_torques);

    % calculate mean of degree of freedom number 1 for all trials:
    subject(subject_k).torque = mean(temp_torques(:,1));
end

subject_k件名カウンター変数に使用していることに注意してください。MATLAB でandを変数名として使用する場合は注意してください。それらは既に 0 + 1.000i (複素数) として定義されているからijです。

于 2013-08-08T19:15:23.697 に答える
0

上記のコメントで述べたように、別のループと一時変数を追加するのが最も簡単な実行であることがわかりました。

于 2013-09-23T23:59:42.143 に答える