[ITK-users] vnl_svd Segfaults on 3xn matrix, but not on nx3?
DVigneault
davis.vigneault at gmail.com
Wed Jul 23 11:19:56 EDT 2014
All--
I'm trying to fit a plane through an image (treating indices as x and y and
pixel value as z) by reading an image into a 3xn matrix and computing the
singular value decomposition with vnl. However, I'm getting a segfault when
I call the SVD function. I do not get a segfault when I call the SVD on the
transpose of the same matrix. Could anyone suggest (a) why this is
segfaulting or (b) a better way to fit a plane to an image in ITK?
Below is a minimal example of the problem. (Apologies for the many
questions--I very much appreciate Brad's and other's help.)
#include "itkImageFileReader.h"
#include "itkImageRegionIteratorWithIndex.h"
#include "itkVariableSizeMatrix.h"
#include "vnl/vnl_matrix.h"
const unsigned int Dimension = 2;
typedef double WorkPixelType;
typedef itk::Image< WorkPixelType, Dimension > WorkImageType;
typedef itk::ImageFileReader< WorkImageType > ReaderType;
typedef itk::VariableSizeMatrix< WorkPixelType > MatrixType;
typedef itk::ImageRegionIteratorWithIndex< WorkImageType > ItType;
int main( int argc, char * argv[] )
{
// Read in file
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName( "../data/input/wrapped_WT_square.png" );
reader->Update();
WorkImageType::Pointer input = reader->GetOutput();
MatrixType matrix;
matrix.SetSize(3,
input->GetLargestPossibleRegion().GetSize()[0]*input->GetLargestPossibleRegion().GetSize()[0]);
ItType inputIt( input, input->GetLargestPossibleRegion() );
inputIt.GoToBegin();
unsigned int count = 0;
while(!inputIt.IsAtEnd()) {
matrix(0,count) = inputIt.GetIndex()[0];
matrix(1,count) = inputIt.GetIndex()[1];
matrix(2,count) = inputIt.Get();
++count;
++inputIt;
}
vnl_matrix< double > VNLMatrix = matrix.GetVnlMatrix();
// n x 3 matrix works:
vnl_svd<double> svdTranspose(VNLMatrix.transpose()); // Segmentation
fault: 11
std::cout << svdTranspose << std::endl;
// 3 x n matrix segfaults:
vnl_svd<double> svd(VNLMatrix); // Segmentation fault: 11
std::cout << svd << std::endl; // Doesn't make it this far
return EXIT_SUCCESS;
}
--
View this message in context: http://itk-insight-users.2283740.n2.nabble.com/vnl-svd-Segfaults-on-3xn-matrix-but-not-on-nx3-tp7585974.html
Sent from the ITK Insight Users mailing list archive at Nabble.com.
More information about the Insight-users
mailing list