1

おそらく7行目のlegend_vec列サイズが13に達するため??? Subscripted assignment dimension mismatch.days値が達するとエラーが発生します。13

days = [1     2     3     4     5     6    13];
for i=1:nTime
    legend_vec(i,:)=(['After ',num2str(days(i)),' days']);
end

エラーを回避して、保存している間、すべての日を保存するにはどうすればよいlegend_vecですか?ありがとう。

4

2 に答える 2

1

複合文字列を配列に格納しようとすると、ASCII または Unicode 文字番号のリストとして格納されます。したがって、文字列 'Hello world' を配列の最初の行として挿入しようとすると、最初の行は実際には次のようになります。

>>> my_strs = []; 
>>> my_strs(1,:) = "Hello world"
my_strs =

72   101   108   108   111    32   119   111   114   108   100

これは暗黙的my_strsに 1 行 11 列の配列になることに注意してください。2 番目の行として文字列を追加しようとしても、長さが 11 文字コードであると評価されない場合、エラーが発生します。

>>> my_strs(2,:) = "Hi there"
error: A(I,J,...) = X: dimensions mismatch

したがって、空白を追加して、文字列になるときにすべての日の長さを埋めるか (すべての文字列の長さが均一になるようにする)、またはすべての文字列を異なる長さを持つことができるセル配列に格納するなど、より便利なことを行う必要があります。 .

セル配列でそれを行うには、次のようにします。

>>> my_strs = {};
>>> my_strs{1} = "Hello world"
my_strs =

{
  [1,1] = Hello world
}

>>> my_strs{2} = "Hi there"
my_strs =

{
  [1,1] = Hello world
  [1,2] = Hi there
}

>>> my_strs{1,1}
ans = Hello world
>>> my_strs{1,2}
ans = Hi there

上記の質問で示したループで使用しているインデックス規則にそれをマップするのは簡単なはずです。

完全な開示:私は個人的に Matlab をボイコットすることを好むため、Octave を使用して上記のコードをテストしています。その理由が気になる場合は、メタなどで尋ねることができますが、この質問の目的のために、Octave でのテストが正しい答えが何であるかに違いはないと思います。

于 2012-04-11T20:11:11.790 に答える
1

文字列のセル配列を使用します。セル配列 (文字で定義{}) は、異なるデータ型や異なる長さの文字列など、異なるオブジェクトの配列を処理するためのものです。

cell 配列を使用するには、コードを次のように変更します。

days = [1     2     3     4     5     6    13];
for i=1:length(days)
    legend_cell{i,:}=(['After ',num2str(days(i)),' days']);
end

これは一般的な使用法であるため、legendコマンドはこれを入力として受け入れることができます。

plot(randn(10,7),'.')
legend(legend_cell)

他の用途では、次の表記法を使用して個々の文字列にアクセスできます。

thirdString = legend{3};

または、文字の四角形の配列が絶対に必要な場合、Matlab は次の規則をサポートして、開始した場所に戻ることができます。

legend_vec_in_chararray = char(legend_cell);  

このchar関数は、四角形の配列を作成するために、必要に応じてスペースをパディングします。

于 2012-04-11T20:22:45.933 に答える