how to automatically sprintf an array elements

57 Ansichten (letzte 30 Tage)
Homayoon
Homayoon am 21 Mai 2017
Kommentiert: Stephen23 am 10 Aug. 2023
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.

Akzeptierte Antwort

Stephen23
Stephen23 am 21 Mai 2017
Bearbeitet: Stephen23 am 21 Mai 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 Kommentare
Homayoon
Homayoon am 21 Mai 2017
got it. my bad thanks
Stephen23
Stephen23 am 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"

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

amr alanwar
amr alanwar am 3 Okt. 2017
Bearbeitet: amr alanwar am 3 Okt. 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 Kommentare
James Tursa
James Tursa am 3 Okt. 2017
This does not give the desired outcome.
amr alanwar
amr alanwar am 3 Okt. 2017
I did not read the question carefully I modified my reply Thanks

Melden Sie sich an, um zu kommentieren.


Captain Karnage
Captain Karnage am 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'

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by