Hello,
I have the following data which I need to bring to a certain format.
A= [23.5567, 5.34567, 23.1]
B= [-13.5357, 6.254, 2101.2]
C= [4,8,15]
I want to add some string value and certain characters to the above vectors and combine it to get the following format of single column vector:
4-sample1-sample2-(23.56,-13.54)
8-sample1-sample2-(5.35, 6.25)
15-sample1-sample2-(23.10, 2101.20)
Also to get the above format I want to round of A and B vector values to two decimal places but the the earlier Matlab version doesn't have rounding to certain places function.

댓글 수: 2

For the rounding part,
format short
A= [23.5567, 5.34567, 23.1];
B= [-13.5357, 6.254, 2101.2];
C= [4,8,15];
A=round(A,2)
A = 1×3
23.5600 5.3500 23.1000
B=round(B,2)
B = 1×3
1.0e+03 * -0.0135 0.0063 2.1012
C=round(C,2)
C = 1×3
4 8 15
" the earlier Matlab version doesn't have rounding to certain places function."
As the other responders have shown, you can use the i/o library functions with formatting strings to write to desired precision. If the object is rounding, one can then convert the result back to numeric w/ str2double
num2str has had a precision optional argument "since forever" but it is the total number of significant digits so not quite so helpful here.
I see that the optional argument to round wasn't added until R2014b in the Compatibility notes -- that surprises me to be reminded it's that recent an enhancement.
But, it's easy-peasy to do yourself --
Round=@(x,n)round(x*10^n)/10^n;
>> Round(pi,2)
>> ans =
3.1400
>>

댓글을 달려면 로그인하십시오.

 채택된 답변

Voss
Voss 2022년 5월 31일
편집: Voss 2022년 5월 31일

0 개 추천

A= [23.5567, 5.34567, 23.1];
B= [-13.5357, 6.254, 2101.2];
C= [4,8,15];
One way:
sprintfc('%d-sample1-sample2-(%0.2f,%0.2f)',[C; A; B].')
ans = 3×1 cell array
{'4-sample1-sample2-(23.56,-13.54)' } {'8-sample1-sample2-(5.35,6.25)' } {'15-sample1-sample2-(23.10,2101.20)'}
Another way:
arrayfun(@(a,b,c)sprintf('%d-sample1-sample2-(%0.2f,%0.2f)',c,a,b),A,B,C,'Uniform',false).'
ans = 3×1 cell array
{'4-sample1-sample2-(23.56,-13.54)' } {'8-sample1-sample2-(5.35,6.25)' } {'15-sample1-sample2-(23.10,2101.20)'}

댓글 수: 4

Zee
Zee 2022년 6월 1일
Thank you, the first option works. However when I try to read the inputs for A, B and C from an excel file as I large set of input data, instead of getting the answer in C-sample1-sample2-(A,B) format I am getting as C-sample1-sample2-(C,C) format although right inputs have been assigned to the vectors A, B and C. Could you please let me know how can I correct this issue. Also may I know where can I learn more about functions like sprintfc which are not documented. Sorry, newbie here.
dpb
dpb 2022년 6월 1일
sprintfc is just sprintf with the output cast to the cellstr (hence the "c" suffix). @_ has trotted it out here recently quite a bit; I've used MATLAB for 30 years and was unaware of it before, myself. Why TMW doesn't document its existence is a mystery/disservice to users; it is handy to have a builtin function that does the conversion; clearly obvious to be so since the developers found it useful enough to have created it as a builtin. I intended to post an enhancement request to the documentation but hadn't as yet...
You'll have to show us specifically what you did to create the spreadsheet and then how read it -- and then explain what it is that you expect. Writing out data in such string format combined to text is generally not a useful way to save things you want to read back in and retrieve the data from -- it may look good for some purpose, but it's a pain to have to parse going back the other way.
Explain the end purpose of all of this for context, not just the single line of code in isolation and someone may have better ways to solve the underlying problem.
Zee
Zee 2022년 6월 1일
Thank you for explaining. I am just trying to explore different functions and learning from mistakes and troubleshooting at the moment. The second option works and I will read more about this function.
The two return identically the same output; in fact the second is the equivalent of what the internal definition of sprintfc is -- a wrapper that turns the char() array output of sprintf that creates only a single character array for each invocation into a cell array of cellstr() for each element of the arguments passed to sprintf
To see what the difference is, try
sprintf('%d-sample1-sample2-(%0.2f,%0.2f)',C,A,B)
at the command line and see what it returns -- and why the cell array was useful.
Then try
sprintf('%d-sample1-sample2-(%0.2f,%0.2f)\n',C,A,B)
and
whos ans
after each and observe...

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Matt J
Matt J 2022년 5월 31일

0 개 추천

A= [23.5567, 5.34567, 23.1];
B= [-13.5357, 6.254, 2101.2];
C= [4,8,15];
formatSpec="%d-sample1-sample2-(%.2f, %.2f)";
str = compose(formatSpec,C',A',B')
str = 3×1 string array
"4-sample1-sample2-(23.56, -13.54)" "8-sample1-sample2-(5.35, 6.25)" "15-sample1-sample2-(23.10, 2101.20)"

댓글 수: 1

Walter Roberson
Walter Roberson 2022년 5월 31일
User is R2011b, string objects and compose() did not exist back then...

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Data Type Conversion에 대해 자세히 알아보기

제품

릴리스

R2011b

질문:

Zee
2022년 5월 31일

댓글:

dpb
2022년 6월 1일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by