我计算矩阵的行列式,计算因此根据数据的维数调用方法,例如:
template<int X, int Y>
float determinant(X, Y, std::vector<Vector> &data)
{
// Determine the dimensionality of matrix data (x and y)
}
我遇到的问题是,在计算PCA的类中,调用此函数只接受迭代器:
class PCA {
public:
template<typename T>
PCA(T begin, T end)
{
// Determine the X and Y here
float det = determinant(X, Y, ....);
}
};
现在我想知道是否可以从已经通过PCA传递的迭代器中推导出X
和Y
,而不是传递两个整数值。
非常感谢任何建议
编辑:
道歉,我的问题不明确。
基本上,typedef std::vector<double> Vector;
被使用,因此std::vector<Vector> data;
将是向量的向量。
我对此进行了以下操作:
std::vector<Vector> data1 = { {1, 2}, {3, 4}, {5, 6}, {8, 9} }; // 2x2
而当我想添加以下内容时:std::vector<Vector> data2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12} }; // 3x3
显然,在计算行列式时,会有不同的计算方法。
我想从函数中推断出data1是2x2和data2 3x3,而不必专门传递这些值。
答案 0 :(得分:1)
由于矢量不是固定大小的,因此它们可能是锯齿状的。 (用std::array<>
或T [N][M][L]
来约束它;你可以在编译时推断他们的排名。)
我们假设他们不是:看到它 Live On Coliru
#include <vector>
#include <cstdint>
#include <deque>
template <typename V>
std::deque<std::size_t> dims_of(V const& v) {
return {};
}
template <typename T>
std::deque<std::size_t> dims_of(std::vector<T> const& v)
{
if (v.empty())
return { 0 };
else
{
auto dims = dims_of(v.front());
dims.push_front(v.size());
return dims;
}
}
#include <iostream>
int main()
{
std::vector<std::vector<std::vector<int> > > const
v(7, std::vector<std::vector<int> >(
10, std::vector<int>(3, 0)
)
);
for (auto dim : dims_of(v))
std::cout << dim << " ";
}
打印
7 10 3
答案 1 :(得分:0)
如何从PCA派生到持有X和Y的类
template<int X,int Y>
PCA_size : public PCA
{
enum { Xv=X};
enum { Yv=Y};
}
然后你可以将现有的PCA对象重铸为你的
static_cast<PCA_size<3,5> >(PCA_instance);