Faster and More Efficient `squareform()`
8 views (last 30 days)
Show older comments
Royi Avital on 2 Oct 2019
Edited: Royi Avital on 15 Oct 2019
I'm using squareform(pdist(mX)) fairly often.
The problem is squareform() is so slow it makes use of pdist2(mX, mX) faster.
This is basically what squareform() does in the case above:
function [ mY ] = MySquareForm( vX )
numElements = numel(vX);
numDist = (1 + sqrt(1 + (8 * numElements))) / 2;
mY = zeros(numDist, numDist, class(vX));
mY(tril(true(numDist, numDist), -1)) = vX;
mY = mY + mY.';
Basically, imagine you have a symmetric matrix mX then the vector vx above is it lower tringular matrix vectorized.
mX = randn(100, 100);
mX = mX + mX.';
mL = tril(mX, -1);
vX = mL(mL ~= 0);
If the diagonal of is zerod then one could reproduce mX from vX using MySquareForm().
Any ideas how to do the same more efficiently and faster?
Find more on Choose a Solver in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!Start Hunting!