increase the length of a martix every 5 rows

Dear all,
I have a matrix (double array) of dimension 40000 by 7 and I want to increase the length of this matrix every 5 rows by adding a cell NaN.
For instance, if I have initially
A=[2.4332 4.1477;
2.6073 4.5900;
2.2310 3.7442;
2.4555 4.1178;
2.5096 4.1946;
2.7517 4.7802;
2.8372 4.9423;
2.9577 5.1563;
3.2365 5.6061;
3.0658 5.3787;
2.9244 5.0497;
2.6104 4.4623;
2.5419 4.4164;
2.4947 4.3577;
2.5633 4.7050
]
then I want
A=[2.4332 4.1477;
2.6073 4.5900;
2.2310 3.7442;
2.4555 4.1178;
2.5096 4.1946;
NaN NaN
2.7517 4.7802;
2.8372 4.9423;
2.9577 5.1563;
3.2365 5.6061;
3.0658 5.3787;
NaN NaN
2.9244 5.0497;
2.6104 4.4623;
2.5419 4.4164;
2.4947 4.3577;
2.5633 4.7050;
NaN NaN
]
I am looking for an efficient code (1-2 lines if possible)
thank you very much

 채택된 답변

Oleg Komarov
Oleg Komarov 2012년 8월 5일

1 개 추천

The efficient code:
[r,c] = size(A);
add = floor(r/5);
Anew = NaN(r + add,c);
idx = (1:r) + reshape(repmat(0:add-1,5,1),1,r);
Anew(idx,:) = A;
The two line code:
Anew = NaN(size(A,1) + size(A,1)/5,size(A,2));
Anew((1:size(A,1)) + reshape(repmat(0:floor(size(A,1)/5)-1,5,1),1,size(A,1)),:) = A;

댓글 수: 7

antonet
antonet 2012년 8월 5일
편집: antonet 2012년 8월 5일
Hi Oleg,
Which of the two is faster?
thanks
When I test, using a 40000 x 7 array, the two versions are the same speed to within measurement error.
d = 5;
m = size(A,1);
k = m + floor(m/d);
Aout = nan(k,2);
Aout(~~rem(1:k,d+1),:) = A;
antonet
antonet 2012년 8월 5일
thanks Andrei!
Slightly corrected version of Andrei's code, expressed as a function:
function Aout = answer45305_3(A)
d = 5;
m = size(A,1);
k = m + floor(m/d);
Aout = nan(k,size(A,2));
Aout(~~rem(1:k,d+1),:) = A;
end
My tests indicate that this is just shy of 3 times slower than Oleg's versions.
Matt Fig
Matt Fig 2012년 8월 5일
편집: Matt Fig 2012년 8월 5일
I'll take a stab at it.
function Anew = insert_nansmatt(A,x)
% Insert a row of nans in A every x rows.
% A need not have mod(size(A,1),x)==0.
[R,C] = size(A);
S = R + floor(R/x);
Anew = nan(S,C);
idx1 = true(S,1);
idx1(x+1:(x+1):S) = false;
Anew(idx1,:) = A;
i like this one

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

추가 답변 (1개)

Azzi Abdelmalek
Azzi Abdelmalek 2012년 8월 5일
편집: Walter Roberson 2012년 8월 5일

1 개 추천

% this code is for test the example
B=reshape(A,5,2,3);B(6,:,:)=nan;result= reshape(B,18,2)
% this code is for your real data
B=reshape(A,5,7,1400);B(6,:,:)=nan;result= reshape(B,8400,7)
% note that 1400 = 7000/5; and 8400=(5+1)*1400

카테고리

도움말 센터File Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by