lets say i have 4 vectors {x1, x2, x3, x4} and i m interested in the
following quantity
v = kron(x1, kron(x2, kron(x3, x4))))
which is easy to write down for a small number of vectors but how can
one generalize this?
the following is a solution using for loop:
x = rand(2,4); % 4 vectors each of length 2
v = kron(x(:,3), x(:,4));
for n=1:2
v = kron(x(:,3-n), v);
end
v - kron(x(:,1), kron(x(:,2), kron(x(:,3), x(:,4)))) % check
is there any other way?
the order of the kron products is important of course.
|
|
0
|
|
|
|
Reply
|
awimagic (10)
|
10/22/2011 1:32:14 AM |
|
What's wrong using the for-loop?
Bruno
|
|
0
|
|
|
|
Reply
|
b.luong5955 (6336)
|
10/22/2011 8:38:12 AM
|
|
Here is a vectorized engine, but honestly I don't see the point of insisting on vectorization:
% Random data
x1 = ceil(5*rand(1,3))
x2 = ceil(5*rand(1,2))
x3 = ceil(5*rand(1,4))
X1 = kron(x1,kron(x2,x3))
% Vectorize engine
x={x1 x2 x3};
n=length(x);
c = cell(size(x));
[c{:}]=ndgrid(x{end:-1:1});
c = cat(n+1,c{:});
X2 = reshape(prod(c,n+1),1,[])
isequal(X1,X2)
% Bruno
|
|
0
|
|
|
|
Reply
|
b.luong5955 (6336)
|
10/22/2011 12:45:17 PM
|
|
On 22 Okt., 14:45, "Bruno Luong" <b.lu...@fogale.findmycountry> wrote:
> Here is a vectorized engine, but honestly I don't see the point of insisting on vectorization:
>
> % Random data
> x1 = ceil(5*rand(1,3))
> x2 = ceil(5*rand(1,2))
> x3 = ceil(5*rand(1,4))
>
> X1 = kron(x1,kron(x2,x3))
>
> % Vectorize engine
> x={x1 x2 x3};
> n=length(x);
> c = cell(size(x));
> [c{:}]=ndgrid(x{end:-1:1});
> c = cat(n+1,c{:});
> X2 = reshape(prod(c,n+1),1,[])
>
> isequal(X1,X2)
>
> % Bruno
Hi,
the v = kron(x1, kron(x2, kron(x3, x4)))) is a typical recursive
problem.
You can write a recursive function, which calculates your result. But
it probably wouldn't really be faster.
Since you have a working solution, I'm not sure it would be worthwile.
Here's the wikipedia article on recursion :
http://en.wikipedia.org/wiki/Recursion_%28computer_science%29
And here's the pseusocode for a recursive implementation of the
factorial function, just as an example:
factorial(n)
if (n <= 1)
return 1;
else
return n * factorial(n-1);
|
|
0
|
|
|
|
Reply
|
mister.hb
|
10/22/2011 1:03:09 PM
|
|
Awhan Patnaik <awimagic@gmail.com> wrote in message <64ee5575-c0f8-4faf-bbb5-db488ed49654@k13g2000prg.googlegroups.com>...
> lets say i have 4 vectors {x1, x2, x3, x4} and i m interested in the
> following quantity
>
> v = kron(x1, kron(x2, kron(x3, x4))))
>
> which is easy to write down for a small number of vectors but how can
> one generalize this?
==============
Consider not expanding out the kronecker product at all (unless you really need to) using this tool:
http://www.mathworks.com/matlabcentral/fileexchange/25969-efficient-object-oriented-kronecker-product-manipulation
In your case it would be
v=KronProd({x4,x3,x2,x1});
If you really need to, you can expand it using
full(v) or sparse(v), as appropriate. This will use a for-loop, but like Bruno says, I don't see why vectorizing is preferable.
|
|
0
|
|
|
|
Reply
|
mattjacREMOVE (3177)
|
10/22/2011 5:19:13 PM
|
|
The fastest is for-loop using matrix product:
n = 10;
m = 5;
x = rand(m,n); % 10 vectors of length 5
tic
X1 = 1;
for k=1:size(x,2)
X1 = kron(X1,x(:,k));
end
toc
% Fastest method
tic
X2 = 1;
for k=1:size(x,2)
X2 = x(:,k)*X2;
X2 = X2(:)';
end
X2 = X2';
toc
% Bruno
|
|
0
|
|
|
|
Reply
|
b.luong5955 (6336)
|
10/22/2011 7:15:28 PM
|
|
thanks for the answers and comments. nothing wrong with the for loop
as it gets the job done. just wanted to see if any alternate approach
was possible. thanks again.
|
|
0
|
|
|
|
Reply
|
awimagic (10)
|
10/23/2011 4:32:54 AM
|
|
|
6 Replies
43 Views
(page loaded in 0.997 seconds)
|