cisst-saw
Loading...
Searching...
No Matches
cmnDataFunctionsMatrixHelpers.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/* ex: set filetype=cpp softtabstop=4 shiftwidth=4 tabstop=4 cindent expandtab: */
3
4/*
5 Author(s): Anton Deguet
6 Created on: 2012-07-09
7
8 (C) Copyright 2012-2018 Johns Hopkins University (JHU), All Rights Reserved.
9
10--- begin cisst license - do not edit ---
11
12This software is provided "as is" under an open source license, with
13no warranty. The complete license can be found in license.txt and
14http://www.cisst.org/cisst/license.txt.
15
16--- end cisst license ---
17*/
18
19#pragma once
20
21#ifndef _cmnDataFunctionsMatrixHelpers_h
22#define _cmnDataFunctionsMatrixHelpers_h
23
24template <class _matrixType>
25void cmnDataMatrixCopy(_matrixType & data,
26 const _matrixType & source)
27{
28 // resize destination if needed
29 data.resize(source.size());
30 typedef _matrixType MatrixType;
31 typedef typename MatrixType::iterator iterator;
32 typedef typename MatrixType::const_iterator const_iterator;
33 const const_iterator endSource = source.end();
34 const_iterator iterSource = source.begin();
35 iterator iterData = data.begin();
36 for (;
37 iterSource != endSource;
38 ++iterSource, ++iterData) {
40 }
41}
42
43template <class _matrixType>
44std::string cmnDataMatrixHumanReadable(const _matrixType & data)
45{
46 std::stringstream stringStream;
47 const size_t rows = data.rows();
48 const size_t cols = data.cols();
49 stringStream << "[";
50 for (size_t row = 0; row < rows; ++row) {
51 if (row != 0) {
52 stringStream << ", ";
53 }
54 stringStream << "[";
55 for (size_t col = 0; col < cols; ++col) {
56 if (col != 0) {
57 stringStream << ", ";
58 }
59 stringStream << cmnData<typename _matrixType::value_type>::HumanReadable(data.at(row, col));
60 }
61 stringStream << "]";
62 }
63 stringStream << "]";
64 return stringStream.str();
65}
66
67template <class _matrixType>
68void cmnDataMatrixSerializeText(const _matrixType & data,
69 std::ostream & outputStream,
70 const char delimiter)
71 CISST_THROW(std::runtime_error)
72{
73 typedef typename _matrixType::const_iterator const_iterator;
74 const const_iterator begin = data.begin();
75 const const_iterator end = data.end();
76 for (const_iterator iter = begin; iter != end; ++iter) {
77 if (iter != begin) {
78 outputStream << delimiter;
79 }
81 }
82}
83
84template <class _matrixType>
85void cmnDataMatrixDeSerializeText(_matrixType & data,
86 std::istream & inputStream,
87 const char delimiter)
88{
89 // get data
90 typedef typename _matrixType::iterator iterator;
91 const iterator begin = data.begin();
92 const iterator end = data.end();
93 for (iterator iter = begin; iter != end; ++iter) {
94 if (iter != begin) {
95 cmnDataDeSerializeTextDelimiter(inputStream, delimiter, "std::matrix");
96 }
98 }
99}
100
101template <class _matrixType>
103 std::istream & inputStream,
104 const char delimiter)
105 CISST_THROW(std::runtime_error)
106{
107 // deserialize size
108 size_t rows, cols;
109 cmnData<size_t>::DeSerializeText(rows, inputStream, delimiter);
110 cmnDataDeSerializeTextDelimiter(inputStream, delimiter, "vctFixedSizeMatrixBase");
111 cmnData<size_t>::DeSerializeText(cols, inputStream, delimiter);
112 data.resize(rows, cols);
113 if (data.size() > 0) {
114 cmnDataDeSerializeTextDelimiter(inputStream, delimiter, "vctFixedSizeMatrixBase");
115 cmnDataMatrixDeSerializeText(data, inputStream, delimiter);
116 }
117}
118
119template <class _matrixType>
121 std::istream & inputStream,
122 const char delimiter)
123 CISST_THROW(std::runtime_error)
124{
125 // deserialize size
126 size_t rows, cols;
127 cmnData<size_t>::DeSerializeText(rows, inputStream, delimiter);
128 cmnDataDeSerializeTextDelimiter(inputStream, delimiter, "vctFixedSizeMatrixBase");
129 cmnData<size_t>::DeSerializeText(cols, inputStream, delimiter);
130 if ((data.rows() != rows) || (data.cols() != cols)) {
131 cmnThrow("cmnDataDeSerializeText: matrix size doesn't match");
132 return;
133 }
134 if (data.size() > 0) {
135 cmnDataDeSerializeTextDelimiter(inputStream, delimiter, "vctFixedSizeMatrixBase");
136 cmnDataMatrixDeSerializeText(data, inputStream, delimiter);
137 }
138}
139
140template <class _matrixType>
141std::string cmnDataMatrixSerializeDescription(const _matrixType & data,
142 const char delimiter,
143 const std::string & userDescription,
144 const bool serializeSize)
145{
146 std::string prefix = (userDescription == "") ? "m[" : (userDescription + "[");
147 std::stringstream indexSuffix;
148 std::stringstream description;
149 const size_t rows = data.rows();
150 const size_t cols = data.cols();
151 if (serializeSize) {
152 description << cmnData<size_t>::SerializeDescription(rows, delimiter, (userDescription == "") ? "v.rows" : (userDescription + ".rows"))
153 << delimiter
154 << cmnData<size_t>::SerializeDescription(cols, delimiter, (userDescription == "") ? "v.cols" : (userDescription + ".cols"));
155 }
156 size_t row, col;
157 for (row = 0; row < rows; ++row) {
158 for (col = 0; col < cols; ++col) {
159 if ((row + col) != 0 || serializeSize) {
160 description << delimiter;
161 }
162 indexSuffix.clear();
163 indexSuffix.str(std::string());
164 indexSuffix << row << "," << col << "]";
165 description << cmnData<typename _matrixType::value_type>::SerializeDescription(data.Element(row, col), delimiter, prefix + indexSuffix.str());
166 }
167 }
168 return description.str();
169}
170
171template <class _matrixType>
172void cmnDataMatrixSerializeBinary(const _matrixType & data,
173 std::ostream & outputStream)
174 CISST_THROW(std::runtime_error)
175{
176 typedef typename _matrixType::const_iterator const_iterator;
177 const const_iterator end = data.end();
178 const_iterator iter = data.begin();
179 for (; iter != end; ++iter) {
181 }
182}
183
184template <class _matrixType>
185void cmnDataMatrixDeSerializeBinary(_matrixType & data,
186 std::istream & inputStream,
187 const cmnDataFormat & localFormat,
188 const cmnDataFormat & remoteFormat)
189 CISST_THROW(std::runtime_error)
190{
191 // deserialize data
192 typedef typename _matrixType::iterator iterator;
193 const iterator end = data.end();
194 iterator iter = data.begin();
195 for (; iter != end; ++iter) {
196 cmnData<typename _matrixType::value_type>::DeSerializeBinary(*iter, inputStream, localFormat, remoteFormat);
197 }
198}
199
200template <class _matrixType>
202 std::istream & inputStream,
203 const cmnDataFormat & localFormat,
204 const cmnDataFormat & remoteFormat)
205 CISST_THROW(std::runtime_error)
206{
207 // deserialize size and resize
208 size_t rows, cols;
209 cmnDataDeSerializeBinary_size_t(rows, inputStream, localFormat, remoteFormat);
210 cmnDataDeSerializeBinary_size_t(cols, inputStream, localFormat, remoteFormat);
211 data.resize(rows, cols);
212 cmnDataMatrixDeSerializeBinary(data, inputStream, localFormat, remoteFormat);
213}
214
215template <class _matrixType>
217 std::istream & inputStream,
218 const cmnDataFormat & localFormat,
219 const cmnDataFormat & remoteFormat)
220 CISST_THROW(std::runtime_error)
221{
222 // deserialize size and check
223 size_t rows, cols;
224 cmnDataDeSerializeBinary_size_t(rows, inputStream, localFormat, remoteFormat);
225 cmnDataDeSerializeBinary_size_t(cols, inputStream, localFormat, remoteFormat);
226 if ((data.rows() != rows)
227 || (data.cols() != cols)) {
228 cmnThrow("cmnDataDeSerializeBinary: matrix size doesn't match");
229 return;
230 }
231 cmnDataMatrixDeSerializeBinary(data, inputStream, localFormat, remoteFormat);
232}
233
234template <class _matrixType>
235size_t cmnDataMatrixScalarNumber(const _matrixType & data, const bool includeSize)
236{
237 size_t result = includeSize ? 2 : 0;
238 typedef typename _matrixType::value_type value_type;
239 if (cmnData<value_type>::ScalarNumberIsFixed(data.Element(0, 0))) {
240 return result + data.size() * cmnData<value_type>::ScalarNumber(data.Element(0, 0));
241 }
242 typedef typename _matrixType::const_iterator const_iterator;
243 const const_iterator end = data.end();
244 const_iterator iter = data.begin();
245 for (; iter != end; ++iter) {
246 result += cmnData<value_type>::ScalarNumber(*iter);
247 }
248 return result;
249}
250
251template <class _matrixType>
252bool cmnDataMatrixScalarFindInMatrixIndex(const _matrixType & data, const size_t index,
253 size_t & elementRow, size_t & elementCol, size_t & inElementIndex)
254{
255 typedef typename _matrixType::value_type value_type;
256 size_t elementIndex;
257 const size_t scalarNumber = cmnDataMatrixScalarNumber(data, false);
258 if (cmnData<value_type>::ScalarNumberIsFixed(data.Element(0, 0))) {
259 const size_t scalarNumberPerElement = cmnData<value_type>::ScalarNumber(data.Element(0, 0));
260 if (scalarNumberPerElement == 0) {
261 return false;
262 }
263 if (index < scalarNumber) {
264 elementIndex = index / scalarNumberPerElement;
265 inElementIndex = index % scalarNumberPerElement;
266 elementRow = elementIndex / data.cols();
267 elementCol = elementIndex % data.cols();
268 return true;
269 }
270 return false;
271 }
272
273 bool indexFound = false;
274 size_t scalarCounter = 0;
275 size_t lastScalarInElement = 0;
276 size_t firstScalarInElement = 0;
277 size_t numberOfScalarsInElement = 0;
278 elementIndex = 0;
279 do {
280 elementRow = elementIndex / data.cols();
281 elementCol = elementIndex % data.cols(); ;
282 numberOfScalarsInElement = cmnData<value_type>::ScalarNumber(data.Element(elementRow, elementCol));
283 firstScalarInElement = scalarCounter;
284 lastScalarInElement = scalarCounter + numberOfScalarsInElement - 1;
285 scalarCounter = lastScalarInElement + 1;
286 elementIndex++;
287 indexFound = ((index >= firstScalarInElement) && (index <= lastScalarInElement));
288 } while ((!indexFound)
289 && (elementIndex < data.size()));
290 if (indexFound) {
291 elementIndex--;
292 inElementIndex = index - firstScalarInElement;
293 return true;
294 }
295 return false;
296}
297
298template <class _matrixType>
299std::string cmnDataMatrixScalarDescription(const _matrixType & data,
300 const size_t index,
301 const std::string & userDescription,
302 const bool includeSize)
303 CISST_THROW(std::out_of_range)
304{
305 size_t elementRow, elementCol, inElementIndex;
306 size_t realIndex = index;
307 std::stringstream suffix;
308 if (includeSize) {
309 if (index == 0) {
310 return cmnData<size_t>::ScalarDescription(data.rows(), 0, userDescription + ".rows");
311 }
312 if (index == 1) {
313 return cmnData<size_t>::ScalarDescription(data.cols(), 0, userDescription + ".cols");
314 }
315 realIndex -= 2;
316 }
317 if (cmnDataMatrixScalarFindInMatrixIndex(data, realIndex, elementRow, elementCol, inElementIndex)) {
318 suffix << "[" << elementRow << ',' << elementCol << "]";
319 return cmnData<typename _matrixType::value_type>::ScalarDescription(data.Element(elementRow, elementCol), inElementIndex, userDescription + suffix.str());
320 }
321 cmnThrow(std::out_of_range("cmnDataScalarDescription: matrix index out of range"));
322 return "";
323}
324
325template <class _matrixType>
326double cmnDataMatrixScalar(const _matrixType & data, const size_t index, const bool includeSize)
327 CISST_THROW(std::out_of_range)
328{
329 size_t elementRow, elementCol, inElementIndex;
330 size_t realIndex = index;
331 if (includeSize) {
332 if (index == 0) {
333 return static_cast<double>(data.rows());
334 }
335 if (index == 1) {
336 return static_cast<double>(data.cols());
337 }
338 realIndex -= 2;
339 }
340 if (cmnDataMatrixScalarFindInMatrixIndex(data, realIndex, elementRow, elementCol, inElementIndex)) {
341 return cmnData<typename _matrixType::value_type>::Scalar(data.Element(elementRow, elementCol), inElementIndex);
342 } else {
343 cmnThrow(std::out_of_range("cmnDataScalar: matrix index out of range"));
344 }
345 return 0.123456789; // unreachable, just to avoid compiler warnings
346}
347
348#endif // _cmnDataFunctionsMatrixHelpers_h
Definition cmnDataFormat.h:30
Definition cmnDataFunctions.h:51
static void Copy(DataType &data, const DataType &source)
static size_t DeSerializeBinary(DataType &data, const char *buffer, size_t bufferSize, const cmnDataFormat &CMN_UNUSED(localFormat), const cmnDataFormat &CMN_UNUSED(remoteFormat))
static std::string SerializeDescription(const DataType &data, const char delimiter, const std::string &userDescription="")
static bool ScalarNumberIsFixed(const DataType &data)
static size_t SerializeBinary(const DataType &data, char *buffer, size_t bufferSize)
static std::string static ScalarDescription(const DataType &data, const size_t index, const std::string &userDescription="") CISST_THROW(std double static Scalar(const DataType &data, const size_t index) CISST_THROW(std size_t ScalarNumber(const DataType &data)
Definition cmnDataFunctions.h:162
size_t CISST_EXPORT cmnDataDeSerializeBinary_size_t(size_t &data, const char *buffer, size_t bufferSize, const cmnDataFormat &localFormat, const cmnDataFormat &remoteFormat)
std::string cmnDataMatrixSerializeDescription(const _matrixType &data, const char delimiter, const std::string &userDescription, const bool serializeSize)
Definition cmnDataFunctionsMatrixHelpers.h:141
void cmnDataMatrixSerializeText(const _matrixType &data, std::ostream &outputStream, const char delimiter) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:68
double cmnDataMatrixScalar(const _matrixType &data, const size_t index, const bool includeSize) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:326
size_t cmnDataMatrixScalarNumber(const _matrixType &data, const bool includeSize)
Definition cmnDataFunctionsMatrixHelpers.h:235
void cmnDataMatrixDeSerializeTextResize(_matrixType &data, std::istream &inputStream, const char delimiter) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:102
std::string cmnDataMatrixHumanReadable(const _matrixType &data)
Definition cmnDataFunctionsMatrixHelpers.h:44
void cmnDataMatrixDeSerializeBinaryCheckSize(_matrixType &data, std::istream &inputStream, const cmnDataFormat &localFormat, const cmnDataFormat &remoteFormat) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:216
void cmnDataMatrixDeSerializeTextCheckSize(_matrixType &data, std::istream &inputStream, const char delimiter) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:120
void cmnDataMatrixSerializeBinary(const _matrixType &data, std::ostream &outputStream) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:172
bool cmnDataMatrixScalarFindInMatrixIndex(const _matrixType &data, const size_t index, size_t &elementRow, size_t &elementCol, size_t &inElementIndex)
Definition cmnDataFunctionsMatrixHelpers.h:252
std::string cmnDataMatrixScalarDescription(const _matrixType &data, const size_t index, const std::string &userDescription, const bool includeSize) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:299
void cmnDataMatrixCopy(_matrixType &data, const _matrixType &source)
Definition cmnDataFunctionsMatrixHelpers.h:25
void cmnDataMatrixDeSerializeBinaryResize(_matrixType &data, std::istream &inputStream, const cmnDataFormat &localFormat, const cmnDataFormat &remoteFormat) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:201
void cmnDataMatrixDeSerializeBinary(_matrixType &data, std::istream &inputStream, const cmnDataFormat &localFormat, const cmnDataFormat &remoteFormat) CISST_THROW(std
Definition cmnDataFunctionsMatrixHelpers.h:185
void cmnDataMatrixDeSerializeText(_matrixType &data, std::istream &inputStream, const char delimiter)
Definition cmnDataFunctionsMatrixHelpers.h:85
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
size_type cols() const
Definition vctDynamicConstMatrixBase.h:243
const_iterator end(void) const
Definition vctDynamicConstMatrixBase.h:209
OwnerType::const_iterator const_iterator
Definition vctDynamicConstMatrixBase.h:95
OwnerType::iterator iterator
Definition vctDynamicConstMatrixBase.h:92
size_type rows() const
Definition vctDynamicConstMatrixBase.h:238
const_iterator begin(void) const
Definition vctDynamicConstMatrixBase.h:203