Efficient way to split a vector into Matrix
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Hi,
I am looking for an efficient way to do the following:
Take an input vector, e.g B = [2;5;8;11;3;6;9;15]
and return the array
D = [2 5 8 11 3;5 8 11 3 6;8 11 3 6 9]
, ie each column is a rolling subvector of B
My attempt below works but it causes a bottleneck in my programme. I have been trying to vectorize it but am finding it difficult.
If somebody has thoughts I would appreciate a pointer.
Thanks!
function ret = MakeMatrix(inputVector, inputLookbackPeriod, numPeriodsToCalculate)
m_Array = zeros(inputLookbackPeriod, numPeriodsToCalculate);
for i=1:numPeriodsToCalculate
m_Array(:,i) = inputVector(i:i+inputLookbackPeriod-1,1);
end
end
0 Kommentare
Akzeptierte Antwort
the cyclist
am 14 Apr. 2011
Here is an obscure way, using a Hilbert matrix. It is semi-coincidental that the indexing you need is exactly the (element-by-element inverse of the) Hilbert matrix.
For something less esoteric, you could probably use the filter command.
function m_Array = MakeMatrixFast(inputVector, inputLookbackPeriod, numPeriodsToCalculate)
H = 1./hilb(max(inputLookbackPeriod,numPeriodsToCalculate));
H = H(1:inputLookbackPeriod,1:numPeriodsToCalculate);
m_Array = inputVector(H);
end
2 Kommentare
the cyclist
am 14 Apr. 2011
Yeah, I should have anticipated that. Can you just put in a rounding command?
Weitere Antworten (2)
Matt Fig
am 14 Apr. 2011
IDX = ones(3,5,'single');
IDX(:,1) = 1:3;
D = B(cumsum(IDX,2))
Or, to match your functional form:
function m_Array = MakeMatrixFast2(inputVector, inputLookbackPeriod, numPeriodsToCalculate)
IDX = ones(inputLookbackPeriod,numPeriodsToCalculate,'single');
IDX(:,1) = 1:inputLookbackPeriod;
m_Array = inputVector(cumsum(IDX,2));
2 Kommentare
Matt Fig
am 14 Apr. 2011
That's o.k.! I tested all three algorithms and yours is actually faster than the cyclist's. Mine is somewhat faster than yours for certain inputs.
Siehe auch
Kategorien
Mehr zu Hilbert and Walsh-Hadamard Transforms 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!