neil
neil

Reputation: 27

matlab concatenating vectors

I'm new to MATLAB, and programming in general, and I am having difficulty accomplishing what I am sure is a very, very simple task:

I have a list of vectors v_i for i from 1 to n (n in some number), all of the same size k. I would like to create a vector v that is a "concatenation" (don't know if this is the correct terminology) of these vectors in increasing order: what I mean by this is that the first k entries of v are the k entries of v_1, the k+1 to 2k entries of v are the k entries of v_2 etc. etc. Thus v is a vector of length nk.

How should I create v?

To put this into context, here is function I've began writing (rpeakindex will just a vector, roughq would be the vector v I mentioned before):

function roughq = roughq(rpeakindex)
for i from 1 to size(rpeakindex) do
    v_i = [rpeakindex(i)-30:1:rpeakindex(i)+90]
end

Any help is appreciated

Upvotes: 1

Views: 382

Answers (4)

eigenchris
eigenchris

Reputation: 5821

Concatenating with horzcat is definitely an option, but since these vectors are being created in a function, it would be better to concatenate these vectors automatically in the function itself rather than write out horzcat(v1,v2,....vn) manually.

Given the function mentioned in the question, I would suggest something like this:

function v = roughq(rpeakindex)
v = zeros(121,length(rpeakindex));                  %// create a 2D array of all zeros
for i = 1:size(rpeakindex) 
    v(:,i) = [rpeakindex(i)-30:1:rpeakindex(i)+90]; %// set result to ith column of v
end
v = v(:)';                                          %'//reshape v to be a single vector with the columns concatenated
end

Here's a simplified example of what's going on:

N = 3;
v = zeros(5,N);
for i = 1:N
    v(:,i) = (1:5)*i;
end
v = v(:)';

Output:

v =

     1     2     3     4     5     2     4     6     8    10     3     6     9    12    15

You may want to read up on MATLAB's colon operator to understand the v(:) syntax.

Upvotes: 0

il_raffa
il_raffa

Reputation: 5190

Let the arrays (vectors) be:

v_1=1:10;
v_2=11:20;
v_3=21:30;
v_4=31:40;

and so on.

If they are few (e. g. 4), you can directly set then as input in the cat function:

v=cat(2,v_1,v_2,v_3,v_4)

or the horzcat function

v=horzcat(v_1,v_2,v_3,v_4)

otherwise you can use the eval function within a loop

v1=[];
for i=1:4
   eval(['v1=[v1 v_' num2str(i) ']'])
end   

Hope this helps.

Upvotes: 1

Amir Sagiv
Amir Sagiv

Reputation: 386

Let's try two things.

First, for concatenating vectors there are a couple of methods here, but the simplest would be

h = horzcat(v_1, v_2);

The bigger problem is to enumerate all vectors with a "for" loop. If your v_n vectors are in a cell array, and they are in fact v{i}, then

h= [];
for j=1:n
 h = horzcat(h, v{i});
end

Finally, if they only differ by name, then call them with

h=[];
for j=1:n
 h= horzcat(h, eval(sprintf('v_%d',j));
end

Upvotes: 1

User1551892
User1551892

Reputation: 3364

If you mean 2d matrix, you are using for holding vectors and each row hold vector v then you can simply use the reshape command in matlab like below:

V = [] ;    
for i = 1:10
   V(i,:) = randi (10,1 ,10) ;
end     
V_reshpae = reshape (V, 1, numel(V)) ;

Upvotes: 0

Related Questions