0

数日前、私はこの質問を投稿し、次の素晴らしい解決策を得ました:

fid = fopen('C:\Testes_veloc\test.txt', 'Wt');
fmt = sprintf('%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',str1,num1,0,2)
[a,b,c,d] = ndgrid(vect2,vect1,day,1:15);
out = sprintf(fmt, [d(:), c(:), b(:), a(:), reshape(permute(MD,[2,1,3,4]),[],1)]'); 
fprintf(fid, '%s', out);

変数str1num1dayvect1vect2およびMDは、この関数の入力です。

  • str1文字列 1x1 です
  • num1整数 1x1 です
  • dayはベクトル 10x1 です
  • vect1ベクトルは 7x1 です
  • vect2ベクトルは 180x1 です
  • MD4D マトリックス (7x180x10x15) です。

目的は、次のようなテキスト ファイルを持つことでした。

result.txt:
RED;12;7;0;2;1;4;7;0.0140
RED;12;7;0;2;2;9;7;0.1484
RED;12;7;0;2;3;7;4;0.1787
RED;12;7;0;2;4;2;6;0.7891
RED;12;7;0;2;5;9;6;0.1160
RED;12;7;0;2;6;9;1;0.9893

ただし、str11x1 文字列ではありません。それは名前のベクトル (189000x1) で、私が望むテキストの長さです。つまり、「RED」だけでなく、他にもさまざまな文字列があります。このベクトル化されたループをこの状況に合わせることは可能ですか?

私はこれを試しました(連結部分に追加しstr1(:)ます)が、失敗しました:

fmt = sprintf('%%s;%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',str1,num1,0,2)
out = sprintf(fmt, [str1 (:), d(:), c(:), b(:), a(:), reshape(permute(MD,[2,1,3,4]),[],1)]'); 

たとえば、str(1,:) = 'RED'; str(2,:) = 'FHAW'; str(3,:) = 'KI81'; このような細胞です。文字列を数字に連結できません。誰にも解決策がありますか?

前もって感謝します。

4

1 に答える 1

1

sprintf (fprintf と同様) は、指定された順序で引数を使用してフォーマット フィールドを埋めます。フォーマットが要求するよりも多くの引数を指定すると、これらの関数は追加の関数を使用してフォーマットを繰り返します。

sprintf('%s %i\n', 'a', 1, 'b', 2, 'c', 3)

% returns

ans =

a 1
b 2
c 3

Matlab の cell unraveling テクニックを使用すると、最初に引数を準備してから、それらを sprintf に渡すことができます。

tmp = {'a', 1, 'b', 2, 'c', 3};
sprintf('%s %i\n', tmp{:})

cell 配列を連結することで、より洗練されたものにすることができます。

tmp1 = {'a','b','c'};
tmp2 = [1 2 3];
tmp = [tmp1' num2cell(tmp2')]'
sprintf('%s %i\n', tmp{:})

% Returns

tmp = 

    'a'    'b'    'c'
    [1]    [2]    [3]


ans =

a 1
b 2
c 3

tmpのレイアウトは、形式のレイアウトを転置していることに注意してください。これは、Matlab が行優先順でデータを読み取るため、sprintf の引数を取得するために、行、列の順に行進するためです。

したがって、シナリオでは、引数を使用して大きなセル配列を作成し、それを sprintf に渡す必要があります。

fid = fopen('C:\Testes_veloc\test.txt', 'Wt');
fmt = sprintf('%%s;%d;%%d;%d;%d;%%d;%%d;%%d;%%.4f \\n',num1,0,2)
[a,b,c,d] = ndgrid(vect2,vect1,day,1:15);
tmp = [str(:) num2cell([d(:) c(:) b(:) a(:) reshape(permute(MD,[2,1,3,4]),[],1)]'])]';
fprintf(fid, fmt, tmp{:});
fclose(fid);
于 2013-08-30T22:26:34.707 に答える