how to automatically sprintf an array elements

조회 수: 227 (최근 30일)
Homayoon
Homayoon 2017년 5월 21일
댓글: Stephen23 2023년 8월 10일
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.

채택된 답변

Stephen23
Stephen23 2017년 5월 21일
편집: Stephen23 2017년 5월 21일
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
Homayoon
Homayoon 2017년 5월 21일
got it. my bad thanks
Stephen23
Stephen23 2023년 8월 10일
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"

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

추가 답변 (2개)

amr alanwar
amr alanwar 2017년 10월 3일
편집: amr alanwar 2017년 10월 3일
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
James Tursa
James Tursa 2017년 10월 3일
This does not give the desired outcome.
amr alanwar
amr alanwar 2017년 10월 3일
I did not read the question carefully I modified my reply Thanks

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


Captain Karnage
Captain Karnage 2023년 8월 9일
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'

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by