PIVector reshape... not works
This commit is contained in:
@@ -159,4 +159,14 @@ template <typename C> _PIReverseWrapper<C> PIReverseWrap(const C & c) {return _P
|
|||||||
#define piForeachRC(i, c) for(const i : PIReverseWrap(c))
|
#define piForeachRC(i, c) for(const i : PIReverseWrap(c))
|
||||||
#define piForeachCR piForeachRC
|
#define piForeachCR piForeachRC
|
||||||
|
|
||||||
|
|
||||||
|
//! \~\brief
|
||||||
|
//! \~english Reshape order enum for reshape() function.
|
||||||
|
//! \~russian Порядок обхода для функции изменения размерности reshape().
|
||||||
|
//! \~ \sa \a PIVector::reshape(), \a PIDeque::reshape()
|
||||||
|
enum ReshapeOrder {
|
||||||
|
ReshapeByRow,
|
||||||
|
ReshapeByColumn
|
||||||
|
};
|
||||||
|
|
||||||
#endif // PICONTAINERS_H
|
#endif // PICONTAINERS_H
|
||||||
|
|||||||
@@ -211,14 +211,6 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! \~\brief
|
|
||||||
//! \~english Reshape order enum for \a reshape() function.
|
|
||||||
//! \~russian Порядок обхода для функции изменения размерности \a reshape().
|
|
||||||
enum ReshapeOrder {
|
|
||||||
byRow,
|
|
||||||
byColumn
|
|
||||||
};
|
|
||||||
|
|
||||||
class iterator {
|
class iterator {
|
||||||
friend class PIVector<T>;
|
friend class PIVector<T>;
|
||||||
private:
|
private:
|
||||||
@@ -1939,22 +1931,36 @@ public:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PIVector<PIVector<T>> reshape(size_t rows, size_t cols, ReshapeOrder order = byRow) const {
|
//! \brief
|
||||||
PIVector<PIVector<T>> ret;
|
//! \~english Changes the dimension of the array, creates a two-dimensional array from a one-dimensional array.
|
||||||
if (isEmpty()) return ret;
|
//! \~russian Изменяет размерность массива, из одномерного массива создает двухмерный.
|
||||||
|
//! \~\details
|
||||||
|
//! \~russian
|
||||||
|
//! \~english
|
||||||
|
//! \~\code
|
||||||
|
//! PIVector<int> v{1, 2, 3, 4};
|
||||||
|
//! PIVector<PIVector<int>> m1 = v.reshape(2,2);
|
||||||
|
//! piCout << m1; // {{1, 2}, {3, 4}}
|
||||||
|
//! PIVector<PIVector<int>> m2 = v.reshape(2,2, ReshapeByColumn);
|
||||||
|
//! piCout << m2; // {{1, 3}, {2, 4}}
|
||||||
|
//! \endcode
|
||||||
|
//! \~\sa \a map(), \a reduce()
|
||||||
|
inline PIVector<PIVector<T>> reshape(size_t rows, size_t cols, ReshapeOrder order = ReshapeByRow) const {
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
if (rows*cols != piv_size) {
|
if (rows*cols != piv_size) {
|
||||||
printf("error with PIVector<%s>::reshape\n", __PIP_TYPENAME__(T));
|
printf("error with PIVector<%s>::reshape\n", __PIP_TYPENAME__(T));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
assert(rows*cols == piv_size);
|
assert(rows*cols == piv_size);
|
||||||
|
PIVector<PIVector<T>> ret;
|
||||||
|
if (isEmpty()) return ret;
|
||||||
ret.resize(rows);
|
ret.resize(rows);
|
||||||
if (order == byRow) {
|
if (order == ReshapeByRow) {
|
||||||
for (size_t r = 0; r < rows; r++) {
|
for (size_t r = 0; r < rows; r++) {
|
||||||
ret[r] = PIVector<T>(&(piv_data[r*cols]), cols);
|
ret[r] = PIVector<T>(&(piv_data[r*cols]), cols);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (order == byColumn) {
|
if (order == ReshapeByColumn) {
|
||||||
for (size_t r = 0; r < rows; r++) {
|
for (size_t r = 0; r < rows; r++) {
|
||||||
ret[r].resize(cols);
|
ret[r].resize(cols);
|
||||||
for (size_t c = 0; c < cols; c++) {
|
for (size_t c = 0; c < cols; c++) {
|
||||||
@@ -1968,18 +1974,18 @@ public:
|
|||||||
template<typename C, typename std::enable_if<
|
template<typename C, typename std::enable_if<
|
||||||
std::is_same<T, PIVector<C>>::value
|
std::is_same<T, PIVector<C>>::value
|
||||||
, int>::type = 0>
|
, int>::type = 0>
|
||||||
inline PIVector<C> reshape(ReshapeOrder order = byRow) const {
|
inline PIVector<C> flat(ReshapeOrder order = ReshapeByRow) const {
|
||||||
PIVector<C> ret;
|
PIVector<C> ret;
|
||||||
if (isEmpty()) return ret;
|
if (isEmpty()) return ret;
|
||||||
size_t rows = size();
|
size_t rows = size();
|
||||||
size_t cols = at(0).size();
|
size_t cols = at(0).size();
|
||||||
ret.reserve(rows * cols);
|
ret.reserve(rows * cols);
|
||||||
if (order == byRow) {
|
if (order == ReshapeByRow) {
|
||||||
for (size_t r = 0; r < rows; r++) {
|
for (size_t r = 0; r < rows; r++) {
|
||||||
ret.append(at(r));
|
ret.append(at(r));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (order == byColumn) {
|
if (order == ReshapeByColumn) {
|
||||||
for (size_t c = 0; c < cols; c++) {
|
for (size_t c = 0; c < cols; c++) {
|
||||||
for (size_t r = 0; r < rows; r++) {
|
for (size_t r = 0; r < rows; r++) {
|
||||||
ret << at(r)[c];
|
ret << at(r)[c];
|
||||||
@@ -1990,6 +1996,37 @@ public:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename C, typename std::enable_if<
|
||||||
|
std::is_same<T, PIVector<C>>::value
|
||||||
|
, int>::type = 0>
|
||||||
|
inline PIVector<PIVector<C>> reshape(size_t rows, size_t cols, ReshapeOrder order = ReshapeByRow) const {
|
||||||
|
#ifndef NDEBUG
|
||||||
|
if (rows*cols != piv_size) {
|
||||||
|
printf("error with PIVector<%s>::reshape\n", __PIP_TYPENAME__(T));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
assert(rows*cols == piv_size);
|
||||||
|
PIVector<PIVector<C>> ret;
|
||||||
|
if (isEmpty()) return ret;
|
||||||
|
// size_t old_rows = size();
|
||||||
|
// size_t old_cols = at(0).size();
|
||||||
|
// ret.resize(rows);
|
||||||
|
// if (order == ReshapeByRow) {
|
||||||
|
// for (size_t r = 0; r < rows; r++) {
|
||||||
|
// ret.append(at(r));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (order == ReshapeByColumn) {
|
||||||
|
// for (size_t c = 0; c < cols; c++) {
|
||||||
|
// for (size_t r = 0; r < rows; r++) {
|
||||||
|
// ret << at(r)[c];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// ret.resize(rows * cols);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline void _reset() {piv_size = piv_rsize = 0; piv_data = 0;}
|
inline void _reset() {piv_size = piv_rsize = 0; piv_data = 0;}
|
||||||
inline size_t asize(size_t s) {
|
inline size_t asize(size_t s) {
|
||||||
@@ -2086,7 +2123,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef PIP_STD_IOSTREAM
|
#ifdef PIP_STD_IOSTREAM
|
||||||
//! \~english Output operator to [std::ostream](https://en.cppreference.com/w/cpp/io/basic_ostream).
|
//! \~english Output operator to [std::ostream](https://en.cppreference.com/w/cpp/io/basic_ostream).
|
||||||
//! \~russian Оператор вывода в [std::ostream](https://ru.cppreference.com/w/cpp/io/basic_ostream).
|
//! \~russian Оператор вывода в [std::ostream](https://ru.cppreference.com/w/cpp/io/basic_ostream).
|
||||||
@@ -2124,5 +2160,4 @@ inline PICout operator <<(PICout s, const PIVector<T> & v) {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
inline void piSwap(PIVector<T> & f, PIVector<T> & s) {f.swap(s);}
|
inline void piSwap(PIVector<T> & f, PIVector<T> & s) {f.swap(s);}
|
||||||
|
|
||||||
|
|
||||||
#endif // PIVECTOR_H
|
#endif // PIVECTOR_H
|
||||||
|
|||||||
31
main.cpp
31
main.cpp
@@ -62,33 +62,8 @@ PICout operator <<(PICout s, const ConstChars & v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char * argv[]) {
|
int main(int argc, char * argv[]) {
|
||||||
// const char * dd = "12345";
|
PIVector<int> v{1, 2, 3, 4};
|
||||||
// char text[]{ "hello" };
|
PIVector<PIVector<int>> v2 = v.reshape(2,2, ReshapeByRow);
|
||||||
// ConstChars s("test");
|
piCout << v2;
|
||||||
// piCout << s;
|
|
||||||
// ConstChars s2;
|
|
||||||
// piCout << s2;
|
|
||||||
// s2 = s;
|
|
||||||
// piCout << s2;
|
|
||||||
// s2 = text;
|
|
||||||
// s = s2;
|
|
||||||
// piCout << s << s2;
|
|
||||||
//// s2 = s;
|
|
||||||
// text[1] = '0';
|
|
||||||
// piCout << text;
|
|
||||||
// piCout << s << s2 << ConstChars(text, 3);
|
|
||||||
//// piCout << s << s2;
|
|
||||||
//// PIString ss(s.data(), s.length());
|
|
||||||
//// piCout << ss;
|
|
||||||
// PICout(PICoutManipulators::DefaultControls | PICoutManipulators::AddQuotes) << PIString(dd);
|
|
||||||
|
|
||||||
// piCout << PIString::fromUTF8("test");
|
|
||||||
// piCout << PIString::fromUTF8("бюд\n");
|
|
||||||
// piCout.writePIString(PIString::fromUTF8("test\n"));
|
|
||||||
// piCout.writePIString(PIString::fromUTF8("бюд\n"));
|
|
||||||
// piCout << "бюд\n";
|
|
||||||
PIVector<int> v{1, 2, 3, 4, 5};
|
|
||||||
int s = v.reduce<int>([](int e, int acc){return acc + e;});
|
|
||||||
piCout << s; // 15
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user