Repeating elements (vector)

Hi everyone,
Suppose I have matrix A
A = [1; 2; 3; 4]
And I want to have matrix B
B = [1; 1; 2; 1; 2; 3; 1; 2; 3; 4]
I don't want to use loop to do so because I have lots of observations. So how can I do this efficiently without using loop? Thank you very much!
Jeff

5 个评论

@Tsz Heung: what is the rule to generate B from A ?
What do you mean? My question is how can I generate B from A.
I assume the rule is you want just the 1st row, then the first 2 rows, then the first 3 rows, etc, all collapsed into a single vector.
@Tsz Heung: There is an infinite number of methods to create B based on A from your example. To create a program, we have to know the definition of the procedure. One example is not enough to define this unequivocally.
@Adam: You mean:
  • one time the first row
  • one time the first 2 rows
  • two times the first 3 rows
  • one time the last row
???
Adam
Adam 2017-1-19
编辑:Adam 2017-1-19
No, I meant
  • one time the first row,
  • one time the first 2 rows,
  • one time the first 3 rows,
  • one time the first 4 rows,...

请先登录,再进行评论。

 采纳的回答

Stephen23
Stephen23 2017-1-19
编辑:Stephen23 2017-1-19
There are most likely much more efficient algorithms than this:
>> N = 4;
>> X = (1:N)'*ones(1,N);
>> X(triu(true(N)))
ans =
1
1
2
1
2
3
1
2
3
4
You can use X as indices into your vector to select the values that you want.

2 个评论

+1: An excellent guess.
Really Appreciated! Thank you Stephen!

请先登录,再进行评论。

更多回答(1 个)

nonzeros(triu(repmat(A,1,length(A))))
Note: this assumes that none of the entries are 0.

2 个评论

+1 very nice. It would be interesting to know if repmat or multiply is faster:
nonzeros(triu((1:N)'*ones(1,N)))
Really Appreciated! Thank you Walter!

请先登录,再进行评论。

类别

帮助中心File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by