How to generate a file name by combining variable characters based on the input of the matlab?
447 ビュー (過去 30 日間)
古いコメントを表示
Dear Matlab community,
Maybe somebody can help me with the following problem. For a project I would like to make file names based on the input of my matlab code. Therefore I first generate the name of the file and I was trying the following:
formatSpec = 'output_file_%s_value%.2f_%d_s%d.txt';
name='abc';
a_value = 0.90;
b_values = [20 10 -5 60];
c_value = 4;
output_file = sprintf(formatSpec,name,a_value,b_values,c_value);
Nevertheless, this is not working and I would like to achieve the following outcome in this example: output_file= output_file_abc_value0.90_20_10_-5_60_s4. Another complexity is that the length of the "b_value"-vector (in this case 4 values, but it could also be 2 or 10 values) changes based on the input of the program.
At the moment I don't know how I can generate this output with the varying length of the "b-values"-value.
Thank you.
0 件のコメント
採用された回答
Alex Mcaulley
2019 年 3 月 11 日
Try this:
name='abc';
a_value = 0.90;
b_values = [20 10 -5 60];
c_value = 4;
output_file = ['output_file_' name '_value' num2str(a_value,'%.2f') '_' strrep(num2str(b_values(:)'), ' ', '_') '_s' num2str(c_value) '.txt'];
0 件のコメント
その他の回答 (2 件)
dpb
2019 年 3 月 11 日
You're on right track...
fmt= 'output_file_%s_value%0.2f_%03d_s%03d.txt'; % use fixed width with leading zeros so will sort numerically
>> sprintf(fmt,name,a,b(1),c) % one value example
ans =
'output_file_abc_value0.90_020_s004.txt'
>> for i=1:numel(b) % for the array
sprintf(fmt,name,a,b(i),c)
end
ans =
'output_file_abc_value0.90_020_s004.txt'
ans =
'output_file_abc_value0.90_010_s004.txt'
ans =
'output_file_abc_value0.90_-05_s004.txt'
ans =
'output_file_abc_value0.90_060_s004.txt'
>>
For each element that is changed in any of the input variables you need to build a name. You can construct the loop to either loop through and generate all the names first and store in cellstr or string array or, just build the filename inside the overall calculation loop at the point you're ready to use it.
An alternative would be to use some other "helper" functions...
fnFName=@(B) sprintf(fmt,name,a,B,c) % anonymous function with the array argument
>> arrayfun(fnFName,b.','uni',0) % call with the array of b names
ans =
4×1 cell array
{'output_file_abc_value0.90_020_s004.txt'}
{'output_file_abc_value0.90_010_s004.txt'}
{'output_file_abc_value0.90_-05_s004.txt'}
{'output_file_abc_value0.90_060_s004.txt'}
>>
In the above, the other variables that are single-valued are inherent in the definition of the anonymous function at the time it is defined. If one of those is to be changed, then the anonymous function must also be redefined to reflect that change.
0 件のコメント
Steven Lord
2019 年 3 月 11 日
編集済み: Steven Lord
2019 年 3 月 11 日
If you're using a sufficiently recent release of MATLAB, you can combine string, char, and numeric data using +.
name='abc';
a_value = 0.90;
b_values = [20 10 -5 60];
c_value = 4;
outputfiles = "output_file_" + name + "_value" + a_value + "_" + ...
b_values + "_s" + c_value + ".txt"
You can even get fancier with implicit expansion. The following code creates a 2-by-4 string array.
a_value = [0.9; 0.8];
outputfiles = "output_file_" + name + "_value" + a_value + "_" + ...
b_values + "_s" + c_value + ".txt"
oneSelectedFile = outputfiles(2, 3)
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Entering Commands についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!