2

私の問題: char型の配列Aがあり、次のようになります。

196800271010
902589451069
052068830384
901778191098

Aを数値行列に変換して、文字を個々の整数に分割したいのです。

[1 9 6 8 0 0 2 7 1 0 1 0
 9 0 2 5 8 9 4 5 1 0 6 9
 0 5 2 0 6 8 8 3 0 3 8 4
 9 0 1 7 7 8 1 9 1 0 9 8]

このための最良の方法は何ですか? str2num(A)を試しまし たが、文字は1行に1つの整数として扱われます(つまり、最初の行は1.9680です)これもforループで試しました

for i = 1:5 %the number of rows in the char array
    s = num2str(A(i,:));
    for t = length(s):-1:1
        result(t) = str2num(s(t));
    end
end

しかし、これは配列の最後の行を返すだけです。すべてを取得したいと思います。

4

4 に答える 4

4

行列を列ベクトルに変換すると、各文字は異なる行に配置されるため、で個別に処理できますstr2num。その後、reshape戻って:

result = reshape(str2num(A(:)), size(A))
于 2013-03-13T16:13:18.397 に答える
0

なぜ2回変換しているのかわかりません。両方のインデックスを調べて、各文字を変換し、新しいマトリックスに配置するだけです。

for i = 1:size(A,1)
    for t = 1:size(A,2)
        result(i,t) = str2num(A(i,t));
    end
end

PS:resultループの前に事前に割り当てると、速度が向上します。

result = zeros(size(A))
于 2013-03-13T16:12:34.037 に答える
0

エイタンTの答えはおそらく最高です。それはよりクリーンでおそらくより速いです。しかし、指摘すべきいくつかの関連する索引付けの問題があります。

入力文字がすべて数字であることがわかっている場合は、文字「0」から「9」が連続しているという事実を使用して、Unicode文字値でトリックを使用できます。

result = double(A) - double('0');

結果へのインデックス付けに使用していないことを除いて、元のコードはほぼi機能します。そのため、その外側のループを通過するたびに1つの行を書き換えます。両方のインデックスを使用すると、結果は正しい形になります。

for i = 1:5 %the number of rows in the char array
    s = num2str(A(i,:));
    for t = length(s):-1:1
        result(i,t) = str2num(s(t));
    end
end

それはあなたが望む出力を得るでしょう。ただし、後で発生する問題がいくつかあります。num2str()データはすでにcharであるため、呼び出しは不要です。あなたはそれを取り除くことができます。A(i,t)の代わりに使用できますs。そして、舞台裏での呼び出し以来、str2double一般的に高速で安全です。str2numstr2numeval

ただし、1つのループで多次元配列のすべての要素を反復処理することもできます。これは、より一般的なアプローチです。単一のインデックスを使用する場合、Matlabは、その次元に関係なく、配列に線形にインデックスを付けます。

result = NaN(size(s));
for i = 1:numel(s)
    result(i) = str2double(s(i));
end
于 2013-03-18T03:42:40.563 に答える
0

マトリックスresult1はあなたが望むものです。

ここに画像の説明を入力

于 2013-03-13T17:46:04.997 に答える