[ITK-users] Is this a bug ?

Francois Budin francois.budin at kitware.com
Sat Nov 5 09:41:23 EDT 2016


Hello Cyril,

Thank you for pointing out this behavior. This is a memory allocation
problem in your program. To need to create some memory space to save the
data that is returned by the vnl_matrix.
See below a way to solve your issue.

Hope this helps,
Francois

#include <iostream>
#include <vnl_vector.h>
#include <vnl_matrix.h>
#include <cstring>

int main()
{
  vnl_matrix<double> matrix(2, 2);
  matrix.put(0, 0, 4);
  matrix.put(0, 1, 3);
  matrix.put(1, 0, 2);
  matrix.put(1, 1, 1);

  // Display the matrix
  std::cout << "Matrix" << std::endl;
  std::cout << matrix << std::endl;

  // Display the first row of the matrix,
  vnl_vector<double> matrixRow;
  matrixRow = matrix.get_row(0);
  std::cout << "First row, stored in a vnl_vector" << std::endl;
  std::cout << matrixRow << std::endl;

  double matrixRowData[2];
  std::memcpy(matrixRowData,  matrix.get_row(0).data_block(),
2*sizeof(double));
  std::cout << "First row, stored in a double*" << std::endl;
  std::cout << matrixRowData[0] << " " << matrixRowData[1] << std::endl;

  double* matrixRowDataFromVector = matrixRow.data_block();
  std::cout << "First row, stored in a double* after passing through a
vnl_vector" << std::endl;
  std::cout << matrixRowDataFromVector[0] << " " <<
matrixRowDataFromVector[1] << std::endl;

  return 0;
}

Matrix

4 3

2 1


First row, stored in a vnl_vector

4 3

First row, stored in a double*

4 3

First row, stored in a double* after passing through a vnl_vector

4 3


On Fri, Nov 4, 2016 at 10:26 AM, Cyril Mory <cyril.mory at creatis.insa-lyon.fr
> wrote:

> Hello, ITK users,
>
> I've encountered a behavior with vnl_matrix, and I'm wondering whether it
> is a bug or a feature. The following code outputs differents results:
>
> #include <iostream>
> #include <vnl_vector.h>
> #include <vnl_matrix.h>
>
> int main()
> {
>   vnl_matrix<double> matrix(2, 2);
>   matrix.put(0, 0, 4);
>   matrix.put(0, 1, 3);
>   matrix.put(1, 0, 2);
>   matrix.put(1, 1, 1);
>
>   // Display the matrix
>   std::cout << "Matrix" << std::endl;
>   std::cout << matrix << std::endl;
>
>   // Display the first row of the matrix,
>   vnl_vector<double> matrixRow;
>   matrixRow = matrix.get_row(0);
>   std::cout << "First row, stored in a vnl_vector" << std::endl;
>   std::cout << matrixRow << std::endl;
>
>   double* matrixRowData = matrix.get_row(0).data_block();
>   std::cout << "First row, stored in a double*" << std::endl;
>   std::cout << matrixRowData[0] << " " << matrixRowData[1] << std::endl;
>
>   double* matrixRowDataFromVector = matrixRow.data_block();
>   std::cout << "First row, stored in a double* after passing through a
> vnl_vector" << std::endl;
>   std::cout << matrixRowDataFromVector[0] << " " <<
> matrixRowDataFromVector[1] << std::endl;
>
>   return EXIT_SUCCESS;
> }
>
> Output :
>
> Matrix
>
> 4 3
>
> 2 1
>
> First row, stored in a vnl_vector
>
> 4 3
>
> First row, stored in a double*
>
> 0 3
>
> First row, stored in a double* after passing through a vnl_vector
>
> 4 3
>
>
> It was compiled with the following CMakeLists.txt:
>
>
> cmake_minimum_required(VERSION 2.8)
>
> project(IsThisAvnlBug)
>
> find_package(ITK REQUIRED)
> include(${ITK_USE_FILE})
>
> add_executable(IsThisAvnlBug MACOSX_BUNDLE IsThisAvnlBug.cxx)
> target_link_libraries(IsThisAvnlBug ${ITK_LIBRARIES})
>
>
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/insight-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20161105/901a9c5a/attachment.html>


More information about the Insight-users mailing list