source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/zisserman/vgg_numerics/vgg_wedge.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

  • Property svn:executable set to *
File size: 1.8 KB
Line 
1% vgg_wedge  Wedge product of N-1 N-vectors (generalization of cross product).
2%
3% Y = vgg_wedge(X)  Wedge product of columns/rows of X.
4%   Y ... double (1,N).
5%   X ... double (N,N-1).
6% It is Y = X(:,1) \wedge X(:,2) \wedge ... \wedge X(:,N-1). For N=3,
7% wedge product is the same as cross (vector) product. E.g., for N=4,
8% wedge product of three 4-vectors is in fact computation of a plane in
9% 3-D projective space from 3 points in the plane.
10% The sign is chosen so that for any square matrix X it is: det(X) == wedge(X(:,1:end-1))*X(:,end)
11% Works also dually for
12%   Y ... double (N,1).
13%   X ... double (N-1,N).
14%
15% Y = vgg_wedge(X_1,X_2,...,X_{N-1})  Wedge product for each (N-1)-tuple of corresponding columns of X_n.
16%   X_n ... double (N,K)
17%   Y ... double (K,N)
18% Equivalent to
19%   for k = 1:K, Y(k,:) = wedge([X_1(:,k) ... X_{N-1}(:,k)]); end
20% E.g.: wedge(X1,X2) is the same as cross(X1,X2)' but faster.
21% Dual form is not available.
22
23function Y = vgg_wedge(varargin)
24
25if nargin == 1
26
27  X = varargin{1};
28 
29  [N,Nm1] = size(X);
30  if Nm1>N
31    Y = vgg_wedge(X')';
32    return
33  end
34
35  switch N
36   case 3 % make it faster for special case N==3
37    Y = [X(2,1).*X(3,2)-X(3,1).*X(2,2),...
38         X(3,1).*X(1,2)-X(1,1).*X(3,2),...
39         X(1,1).*X(2,2)-X(2,1).*X(1,2)];
40   otherwise
41    for n = 1:N
42      Y(n) = (-1)^(n+N)*det(X([1:n-1 n+1:N],:));
43    end
44  end
45
46else
47 
48  N = nargin + 1;
49  switch N
50   case 3 % make it faster for special case N==3
51    X1 = varargin{1};
52    X2 = varargin{2};
53    Y = [(X1(2,:).*X2(3,:)-X1(3,:).*X2(2,:))',...
54         (X1(3,:).*X2(1,:)-X1(1,:).*X2(3,:))',...
55         (X1(1,:).*X2(2,:)-X1(2,:).*X2(1,:))'];
56   otherwise
57    for k = 1:size(varargin{1},2)
58      for n = 1:N-1
59        X(:,n) = varargin{n}(:,k);
60      end
61      Y(k,:) = vgg_wedge(X);
62    end
63  end
64
65end
66
67 
68return
Note: See TracBrowser for help on using the repository browser.