46 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Matlab
		
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Matlab
		
	
	
| function [ RS, J ] = eliminate(Ab, js)
 | |
| %ELIMINATE This is a simple scalar-level function for eliminating the
 | |
| %matrix Ab into a conditional part RS and a marginal part J.  The scalars
 | |
| %in js are the ones eliminated (corresponding to columns of Ab).  Note that
 | |
| %the returned matrices RS and J will both be the same width as Ab and will
 | |
| %contain columns of all zeros - that is, the column indices will stay the
 | |
| %same in all matrices, unlike in GTSAM where matrix data is only stored for
 | |
| %involved variables.
 | |
| 
 | |
| if size(Ab,1) < size(Ab,2)-1
 | |
|     Ab = [ Ab; zeros(size(Ab,2)-1-size(Ab,1), size(Ab,2)) ];
 | |
| end
 | |
| 
 | |
| % Permute columns
 | |
| origCols = 1:size(Ab,2);
 | |
| jsFront = js;
 | |
| jsBack = setdiff(origCols, js);
 | |
| jsPermuted = [ jsFront jsBack ];
 | |
| Abpermuted = Ab(:,jsPermuted);
 | |
| 
 | |
| % Eliminate (this sparse stuff prevents qr from introducing a permutation
 | |
| R = full(qr(sparse(Abpermuted)));
 | |
| 
 | |
| % Find row split
 | |
| firstRowOfMarginal = numel(jsFront) + 1;
 | |
| for i = size(R,1) : -1 : 1
 | |
|     firstNnz = find(R(i,:), 1, 'first');
 | |
|     if ~isempty(firstNnz)
 | |
|         if firstNnz > numel(jsFront)
 | |
|             firstRowOfMarginal = i;
 | |
|         else
 | |
|             break;
 | |
|         end
 | |
|     end
 | |
| end
 | |
| 
 | |
| % Undo permutation
 | |
| Runpermuted(:,jsPermuted) = R;
 | |
| 
 | |
| % Split up
 | |
| RS = Runpermuted(1:firstRowOfMarginal-1, :);
 | |
| J = Runpermuted(firstRowOfMarginal:size(Ab,2)-1, :);
 | |
| 
 | |
| end
 | |
| 
 |