Clear Filters
Clear Filters

how to automatically sprintf an array elements

171 views (last 30 days)
Dear All,
I have many arrays with various number of columns, that is, I have many 1*m matrices with m varies from 1 to 20. For instance, consider these three hypothetical arrays:
A1 = [1 14 20 8]
A2 = [5 1 20]
A3 = [2]
what I am after is creating a sprintf for each array to put together all array elements such that elements are separated by a dot. For the above examples, the desired outputs are
1.40.20.8 % sprintf('%d.%d.%d.%d', A1(1,1), A1(1,2), A1(1,3), A1(1,4)); three dots required
5.1.20 % sprintf('%d.%d.%d', A2(1,1), A2(1,2), A2(1,3)); two dots required
2 % sprintf('%d', A3(1,1)); no dot required
It is certainly simpler if all of the arrays have same number of columns. But since it is not the case, I have no idea how to proceed. I just want an algorithm which automatically generates the sprintf for me with the correct number of dots.
Thanks.

Accepted Answer

Stephen23
Stephen23 on 21 May 2017
Edited: Stephen23 on 21 May 2017
function str = myfun(vec)
str = sprintf('.%d',vec);
str = str(2:end);
end
and tested:
>> myfun([1,14,20,8])
ans =
1.14.20.8
>> myfun([5,1,20])
ans =
5.1.20
>> myfun([2])
ans =
2
It would be great if MATLAB allowed indexing to follow a function call, as then this could be achieved in an anonymous function.
  2 Comments
Stephen23
Stephen23 on 10 Aug 2023
Since R2016b using the string class:
join(string([1,14,20,8]),".")
ans = "1.14.20.8"
join(string([5,1,20]),".")
ans = "5.1.20"
join(string([2]),".")
ans = "2"

Sign in to comment.

More Answers (2)

amr alanwar
amr alanwar on 3 Oct 2017
Edited: amr alanwar on 3 Oct 2017
For printing an array normally, you can
fprintf('\n A1 = ')
fprintf(' %.3f ', A1)
fprintf('\n A2 = ')
fprintf(' %.3f ', A2)
fprintf('\n A3 = ')
fprintf(' %.3f ', A3)
The results
A1 = 1.000 14.000 20.000 8.000
A2 = 5.000 1.000 20.000
A3 = 2.000
For your question, try playing with
fprintf('%.0f.', A1(1:end-1))
fprintf('%.0f', A1(end))
  2 Comments
James Tursa
James Tursa on 3 Oct 2017
This does not give the desired outcome.
amr alanwar
amr alanwar on 3 Oct 2017
I did not read the question carefully I modified my reply Thanks

Sign in to comment.


Captain Karnage
Captain Karnage on 9 Aug 2023
Here's another alternative, more verbose but on a single line:
A1 = [1 14 20 8];
A2 = [5 1 20];
A3 = [2];
mystr = @(A) sprintf( [ repmat( '%d.', 1, numel(A) - 1 ), '%d' ], A );
mystr(A1)
ans = '1.14.20.8'
mystr(A2)
ans = '5.1.20'
mystr(A3)
ans = '2'

Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!