help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Wish to avoid multiple for loops, but don't know how to do it


From: Brad Ridder
Subject: Re: Wish to avoid multiple for loops, but don't know how to do it
Date: Wed, 25 May 2011 16:47:04 -0400

Hello,

Thank you all who responded.

Mr. Abbott,

Your code does not work as is, but I see what you were getting at, and it gave me an idea, and it worked. However, the Octave perms() command is not what is needed. There is however, a function on the MATLAB central file exchange called "combn()", which returns all combinations of a size k from a vector of size n >= k. This can be used to create all the needed combinations of vectors, without needing all those for loops for indexing.
The only downer is that making huge matrices of vector combinations leads to memory problems, which I am not sure how to remedy at this time.

Thank you all again,

-Brad Ridder


2011/5/19 Ben Abbott <address@hidden>
On May 19, 2011, at 4:05 PM, Jordi Gutiérrez Hermoso wrote:

> On 19 May 2011 12:43, clustro <address@hidden> wrote:
>> for i = 1:N
>>        for j = 1:N
>>                for k = 1:N
>>                        for l = 1:N
>>                                xPoint = [x(i) x(j) x(k) x(l)]';
>>                                fEval_x = colville(xPoint);
>>                                if fEval_x < fmin
>>                                        fmin = fEval_x;
>>                                        xmin = xPoint;
>>                                endif
>>                        endfor
>>                endfor
>>        endfor
>> endfor
>>
>> Where colville() is an optimization toy function.
>>
>> Does anyone have a suggestion on how to avoid 20 nested for loops when
>> trying to scale this algorithm up to higher dimensions?
>
> I don't understand the full extent of your problem, you basically want
> the minimum over the n-fold tensor product of a vector?
>
> You might be able to do this with arrayfun, although I don't
> immediately see how to avoid the actual tensoring.
>
> - Jordi G. H.

I'm not sure how to use arrayfun(), but using cellfun() ...

N = 4;
Nf = factorial (N);
input_permutations = mat2cell (perms (4), ones (Nf, 1), 4);
opt_fun = @(x) colville (x{:});
fEval_x = cellfun (opt_fun, input_permutations);
x_min = input_permutations (fEval_x == min (fEval_x));

The resulting x_min will be a cell array whose length is equal to the number of results equal to the minimum value.

Ben

p.s. I haven't tested this code, so there may be some typo.




--
Bradley James Ridder
Chakrabarti Group
Graduate Student
School of Chemical Engineering
Purdue University



reply via email to

[Prev in Thread] Current Thread [Next in Thread]