Path: news.mathworks.com!not-for-mail
From: <HIDDEN>
Newsgroups: comp.soft-sys.matlab
Subject: symbolic calculation - speeding up
Date: Thu, 15 Nov 2012 21:24:21 +0000 (UTC)
Organization: The MathWorks, Inc.
Lines: 76
Message-ID: <k83mi5$fkd$1@newscl01ah.mathworks.com>
Reply-To: <HIDDEN>
NNTP-Posting-Host: www-02-blr.mathworks.com
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: newscl01ah.mathworks.com 1353014661 16013 172.30.248.47 (15 Nov 2012 21:24:21 GMT)
X-Complaints-To: news@mathworks.com
NNTP-Posting-Date: Thu, 15 Nov 2012 21:24:21 +0000 (UTC)
X-Newsreader: MATLAB Central Newsreader 3858106
Xref: news.mathworks.com comp.soft-sys.matlab:782880

I am using Symbolic Toolbox, and facing serious speed issues. 
Before describing the problem I am facing - here is my intention:

I want to create a matrix A (size n by n) whose i , j entries are defined as follows:

A(i,j) = (i out of j)* p^i * p ^(j-i) * (-1)^(j-i)

This A matrix has a symbolic variable p, but as the size grows the computation(high orders of p, and combination(j,i) ) becomes too slow > over 2 hours for a matrix of size 400*400.

And I would like to get a vector x = A*b 
where b is an 1*n vector whose values are to be read from data. I defined b as a symbolic variable so that for different data files, I would simply plug in and compute A*b in terms of p. 

Here is the code I am using:

%%%%%%%%%%%%%%%%
    %%%fill matrix
 
   n =400;
     %n =  length(rhs);
    A = sym(zeros(n,n));
    sym p;

    for  i=1:n,
        for j=i:n,

            a = j -i;
             
                
                if i <50
                            %Exact Binomial Probability
                            comb = exp( gammaln(i+a+1) - gammaln(i+1) - gammaln(a+1) );
                            A(i,j) = ((-1)^(a))*comb*((1-p)^(a));

                else
                            %%Poisson approximation
                            A(i,j) = ((-1)^(a))*exp(-(i+a)*p + i*log((i+a)*p) - 0.5*log(2*pi*i) + (i+a)*log(i/(exp(1))) )/(p^i);

    end
        end 
    end
    
    
    b = sym('B',[1 n])
    b = sym(b, 'real')
    

         
   xvect = A * b';
    %%And at the end I want to able to plug in rhs and get the x vector in
    %%terms of p. After I will evaluate different p values to see which one
    %%does make sense in my problem.
    
   subs(xvect,sym('B',[1 n]),rhs);
   
  
   %%I haven't included all the part of binomial formula when computing A
   %%(to perfom less calculations)
   %%thus here I multiply them by these coefficients. 
    post =sym(zeros(1,n));  
 
    for i=1:n
       
        post(i)=p ^i;
        
    end
   xvect = xvect.*post';

%%%%%%%%%%%%%%%%


In a thread I'have read that using MatlabFunction is a better idea, but still the following operation :  Z = matlabFunction(x_rhs,'vars',[p, sym('B',[1 n])]) 
takes hours to perfom. 

I would appreciate any suggestions to speed up my code. 

Best regards,