1

構文の問題である可能性があると思います。コードは次のとおりです。

  load ([ 'C:\Users\Abid\Desktop\Inquiry Runs\dtS' ])
 dtS((dtS==0))=nan;
 for j=2:9;
maxS=max(dtS(j,:));
minS=min(dtS(j,:));

maxval(j,:)=dtS((dtS>(maxS-.1*maxS)));
minval(j,:)=dtS((dtS<(minS+.1*minS)));

avmax(j)=mean(maxval(j,:));
avmin(j)=mean(minval(j,:));

avs(j,:)=[avmax(j) avmin(j)]
 end

したがって、行行列のサイズはループごとに異なることがわかります。たとえば、maxval(j,:) は、特定の値を探している 1 つの行に応じて変化します。

これを手動で行ったところ、最初のループでは行列のサイズが (1,1) であることがわかりますが、ループを j=2 に対してのみ実行するように設定すると、行の長さは 13 になります。

通常はループで行列のサイズが変化すると警告が出るだけなのですが、今回は原因がよくわからないためだと思います。

4

1 に答える 1

1

問題は maxval(j, :) が異なるサイズであることです。length(maxval(j, :))ではありませんlength(dtS((dtS>(maxS-.1*maxS))))。maxval は「rectangular」でなければならないため、これは問題を引き起こしますが、このコード行によって拡張された場合、その値の一部が定義されません。検討:

x = [1, 2; 3, 4];
x(3, :) = [5, 6, 7];

このコードが合法である場合、結果は次のようになります。

x: [1, 2, ?;
    3, 4, ?;
    5, 6, 7]

これらの未定義の値のため、matlab ではこれを実行できません。代わりに cell 配列を使用できます。

maxval = cell(9, 1);
avmax = zeros(9, 1);
avs = zeros(9, 2);
for j=2:9;
  maxS=max(dtS(j,:));
  minS=min(dtS(j,:));

  maxval{j} = dtS((dtS>(maxS-.1*maxS)));
  minval{j} = dtS((dtS<(minS+.1*minS)));

  avmax(j)=mean(maxval{j});
  avmin(j)=mean(minval{j});

  avs(j,:)=[avmax(j) avmin(j)]
end
于 2012-04-08T06:39:59.093 に答える