<p>The full <code>fastica.m</code> output is:</p>

<pre><code>[icasig, A, W] = fastica(X); % outputs the estimated separating
matrix W and the corresponding mixing matrix A.
</code></pre>

<p>For a given data matrix <code>X</code> (assume <code>X</code> is a d x N matrix, i.e. each row is an observation), think about the following relationships that correspond to the output of <code>[Y, A, W] = fastica(X).</code></p>

<p><strong>Unmixing</strong>: <code>Y = W*X % X is separated on independent 'sources' Y</code> </p>

<p><code>W</code> is a k x d matrix (k&lt;=d) that separates the sources or independent components from the mixtures in X (d x N) and stores them in Y (k x N). If k is smaller than d, the resulting representation is of reduced dimensionality.</p>

<p><strong>Mixing</strong>: <code>X = A*Y % Y sources are combined through the mixing matrix A</code></p>

<p><code>A</code> is an d x k matrix that mixes k components (k&lt;=d) stored in matrix <code>Y</code> which is k x N (for N observations). <em>A stores the independent components extracted from X, i.e. d-dimensional vectors, k number in total</em>. Moreover <code>Y</code> stores the sources or <em>the projections of X on the independent components</em>.  </p>

<p>From the output of <code>fastica</code> check the values of the following norms (the smaller the norms, the more accurate the separation of the ICA algorithm):</p>

<pre><code>norm(W*X - Y)
norm(X - A*Y)
norm(pinv(A) - W)
norm(pinv(W) - A)
</code></pre>

<p><strong>Regarding the OP questions:</strong></p>

<ul>
<li><code>icasig</code> represents the sources responsible of the data or the <em>projection</em> of the input data on the ICs estimated from <code>train_data</code>. In this case there are k ICs discovered, so 192 points are represented by their k values.</li>
<li>The ICs are given by the vectors in the columns of A. </li>
<li><code>icasig</code> already gives you the projection of the original data on the ICs.</li>
<li>You can use the separating matrix W (close to the pseudo-inverse of W) to project a new set of points <code>Xn</code> by <code>Yn = W*Xn</code>. </li>
</ul>

<p><strong>Example:</strong></p>

<pre><code>% Generate data (N=1000) from distribution
X = gendata(1000);

% Estimate ICs and projections of X  
[Y, A, W] = fastica(X, 'approach', 'defl');    

% New points from the same distribution  
Xn = gendata(50);

% Project new point on ICA estimated independent components  
Yn = W*Xn;
</code></pre>

<p><a href="https://i.stack.imgur.com/qj0Eo.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/qj0Eo.png" alt="enter image description here"></a></p>

<p>(Replace <code>gendata</code> with your own data generating function. For the plot I used the bimodal set, where the mixing is rotation in 2D, from J. Shlens, <a href="http://arxiv.org/abs/1404.2986" rel="nofollow noreferrer">A Tutorial on Independent Component Analysis</a>) </p>
How to project data onto independent components using FastICA in MATLAB
<p>I'm having a question regarding ICA ,it maybe a little basic but I'm new to it. I'm using <a href="http://research.ics.aalto.fi/ica/fastica/" rel="nofollow">FastICA MATLAB toolbox</a></p>

<p>I'm using it as : </p>

<pre><code>[icasig] = fastica(train_data);
</code></pre>

<p>Where <code>train_data</code> is of size <code>[192x23]</code>.</p>

<p>What I understand is : <code>icasig</code> is supposed to be the independent components, so I was expecting that the size of it would be <code>23x23</code> ,the dimension number, like <code>PCA</code> output. Instead the size is <code>22x192</code>, where the dimensions are reduced to 22.
I don't understand what this represents.</p>

<p>So, my question is: does <code>icasig</code> represent the ICs? Then, if this is the case, how to use it to project the original data on the ICs?</p>

<p>If <code>icasig</code> represents the projection of original data on the ICs, how can I extract the ICs themselves to be used in another projection of the testdata?</p>

<p>Thanks a lot for your help.</p>