Skip to content

Commit ebbae04

Browse files
authored
Merge pull request #112 from flucoma/feature/invert-pca
Feature/invert pca
2 parents 973961d + 3a785e5 commit ebbae04

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

include/algorithms/public/PCA.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ class PCA
5858
out = _impl::asFluid(result);
5959
}
6060

61+
void inverseProcessFrame(RealVectorView in, RealVectorView out) const
62+
{
63+
using namespace Eigen;
64+
using namespace _impl;
65+
asEigen<Matrix>(out) = mMean + (asEigen<Matrix>(in).transpose() * mBases.transpose()).transpose();
66+
}
67+
68+
6169
double process(const RealMatrixView in, RealMatrixView out, index k) const
6270
{
6371
using namespace Eigen;

include/clients/nrt/PCAClient.hpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,28 @@ class PCAClient : public FluidBaseClient,
128128
outBuf.samps(0, k, 0) = dest;
129129
return OK();
130130
}
131+
132+
MessageResult<void> inverseTransformPoint(BufferPtr in, BufferPtr out) const
133+
{
134+
if (!mAlgorithm.initialized()) return Error(NoDataFitted);
135+
InOutBuffersCheck bufCheck(mAlgorithm.dims());
136+
BufferAdaptor::Access inBuf(in.get());
137+
BufferAdaptor::Access outBuf(out.get());
138+
if(!inBuf.exists()) return Error("Input buffer not found");
139+
if(!inBuf.valid()) return Error("Input buffer may be zero sized");
140+
if(!outBuf.exists()) return Error("Output buffer not found");
141+
142+
FluidTensor<double, 1> src(mAlgorithm.dims());
143+
FluidTensor<double, 1> dst(mAlgorithm.dims());
144+
index k = std::min(inBuf.numFrames(),mAlgorithm.dims());
145+
146+
src(Slice(0,k)) = inBuf.samps(0,k,0);
147+
Result resizeResult = outBuf.resize(mAlgorithm.dims(), 1, outBuf.sampleRate());
148+
149+
mAlgorithm.inverseProcessFrame(src,dst);
150+
outBuf.samps(0,mAlgorithm.dims(),0) = dst;
151+
return OK();
152+
}
131153

132154
static auto getMessageDescriptors()
133155
{
@@ -136,6 +158,7 @@ class PCAClient : public FluidBaseClient,
136158
makeMessage("transform", &PCAClient::transform),
137159
makeMessage("fitTransform", &PCAClient::fitTransform),
138160
makeMessage("transformPoint", &PCAClient::transformPoint),
161+
makeMessage("inverseTransformPoint", &PCAClient::inverseTransformPoint),
139162
makeMessage("cols", &PCAClient::dims),
140163
makeMessage("size", &PCAClient::size),
141164
makeMessage("clear", &PCAClient::clear),

0 commit comments

Comments
 (0)