Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

MATLAB Array Pre-allocation help!

  1. Jun 23, 2008 #1
    Hi everyone. I'm working on a piece of code and I'm having a bit of trouble with array pre-allocation. Here it is:

    function [react_in1 react_in2 react_out1 react_out2]=oneVtwoXone(masses,prec);

    prec = 1e-4;
    N=length(masses);
    masses=[0;masses]; % adding dummy metabolite with zero mass
    masses=masses(:);

    %mass2=masses*ones(size(masses))'+ones(size(masses))*masses';
    %mass2=mass2(:);

    mass2=zeros(N*(N+1)/2,1); % list of mass pairs
    met1=mass2; % list of the first metabolite in a pair
    met2=mass2; % same for the second metabolite
    k=0;
    for i=1:N
    for j=i:N
    k=k+1;
    met1(k)=i;
    met2(k)=j;
    mass2(k)=masses(i)+masses(j);
    end
    end

    disp(['Number of distinct pairs is' length(mass2) ])

    [mass2, ord]=sort(mass2); % sorted mass pairs
    met1=met1(ord); % metabolites in the same order as sorted mass pairs
    met2=met2(ord);

    dm=diff(mass2);

    while(length(find(dm <= mass2(1:length(dm))*prec)) > 0) % while have metabolite pairs that have about the same mass
    ind=find(dm<mass2(length(mass2)-length(dm)+1:end)*prec);




    react_in1=[react_in1 met1(ind)];
    react_in2=[react_in2 met2(ind)];
    react_out1=[react_out1 met1(ind+1)];
    react_out2=[react_out2 met2(ind+1)];


    dm = dm(1:end-1) + dm(2:end);

    end

    disp(['Number of conforming reactions is' length(react_in1) ])

    The source of my trouble is in the second while loop. The react_in1 etc. takes up too much memory and I need to figure out how to preallocate a matrix to hold values approximately 10000, and how to delete the excess zeros if there is any unused space.

    Can anyone help?
     
  2. jcsd
  3. Jun 23, 2008 #2

    chroot

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    To preallocate a large matrix, just use the zeros() function. Why do you think your matrices are taking up too much memory? Preallocating them will make your code faster, but won't make them take up any less memory.

    - Warren
     
  4. Jun 23, 2008 #3
    well actually i've found that preallocating takes up a significantly less amount of time. i have such a huge data set of 10000 values so my code runs faster. here's what i'm doing now:

    while(length(find(dm <= mass2(1:length(dm))*prec)) > 0) % while have metabolite pairs that have about the same mass
    ind=find(dm<mass2(length(mass2)-length(dm)+1:end)*prec);


    react_in1=zeros(10000, 1); % preallocate a new array for all four reactants
    react_in2=zeros(10000, 1);
    react_out1=zeros(10000, 1);
    react_out2=zeros(10000, 1);
    count = 0;

    for ind=1:10000

    react_in1(ind)=met1(ind);
    react_in2(ind)=met2(ind);
    react_out1(ind)=met1(ind+1);
    react_out2(ind)=met2(ind+1);
    end


    dm = dm(1:end-1) + dm(2:end);

    end

    how do i truncate the unused zeros?
     
  5. Jun 23, 2008 #4

    chroot

    User Avatar
    Staff Emeritus
    Science Advisor
    Gold Member

    An array of 10,000 values is actually quite SMALL.

    You can use the slice operators (like dm(1:10)) to "truncate" an array to whatever size you want.

    - Warren
     
  6. May 10, 2009 #5
    how can I preallocate long strings? in other words, How can I rapidly create a string of a certain length and then fill it in a loop?
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: MATLAB Array Pre-allocation help!
  1. Matlab and arrays (Replies: 0)

  2. Arrays in MATLAB (Replies: 3)

Loading...