本文整理汇总了C++中Tensor::At方法的典型用法代码示例。如果您正苦于以下问题:C++ Tensor::At方法的具体用法?C++ Tensor::At怎么用?C++ Tensor::At使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Tensor
的用法示例。
在下文中一共展示了Tensor::At方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: WeightedAdd
void Tensor::WeightedAdd(Tensor& t1, Tensor& t2, double weight_t1, double weight_t2)
{
assert(t1.NumElements() == t2.NumElements());
for (int i = 0; i < t1.NumElements(); ++i)
{
t1.Set(i, weight_t1 * t1.At(i) + weight_t2 * t2.At(i));
}
}
示例2: Add
// add two tensors, store result in result_tensor which is assumed
// to be uninitialized
void Tensor::Add(Tensor& t1, Tensor& t2)
{
assert(t1.NumElements() == t2.NumElements());
for (int i = 0; i < t1.NumElements(); ++i)
{
t1.Set(i, t1.At(i) + t2.At(i));
}
}
示例3: InnerProduct
// inner product among two tensors of the same size
double Tensor::InnerProduct(Tensor& t1, Tensor& t2)
{
assert(t1.NumElements() == t2.NumElements());
double val = 0;
for (int i = 0; i < t1.NumElements(); ++i)
{
val += t1.At(i) * t2.At(i);
}
return val;
}
示例4: Diff
double Tensor::Diff(Tensor& A, Tensor& B)
{
assert(A.NumElements() == B.NumElements());
double diff = 0;
for (int i = 0; i < A.NumElements(); ++i)
{
diff += abs(A.At(i) - B.At(i));
}
return diff;
}
示例5: Equals
bool Tensor::Equals(Tensor& A, Tensor& B)
{
assert(A.NumElements() == B.NumElements());
for (int i = 0; A.NumElements(); ++i)
{
if (A.At(i) != B.At(i))
return false;
}
return true;
}
示例6: Divide
void Tensor::Divide(Tensor& result_tensor, Tensor& t1, double val)
{
result_tensor.Initialize(t1.Dims());
for (int i = 0; i < t1.NumElements(); ++i)
{
result_tensor.Set(i, t1.At(i) / val);
}
}
示例7: Rearrange
void Tensor::Rearrange(Tensor& result_tensor, Tensor& orig_tensor, vector<int>& old_to_new_modes)
{
vector<int> new_dims;
VectorPlus::Rearrange(new_dims, orig_tensor.Dims(), old_to_new_modes);
result_tensor.Initialize(new_dims);
int i = 0;
FastIndexer indexer(orig_tensor.Dims());
while (indexer.HasNext())
//for (int i = 0; i < orig_tensor.NumElements(); ++i)
{
vector<int>& orig_indices = indexer.GetNext();
// vector<int> orig_indices;
// orig_tensor.ComputeIndexArray(orig_indices, i);
vector<int> new_indices;
VectorPlus::Rearrange(new_indices, orig_indices, old_to_new_modes);
result_tensor.Set(new_indices, orig_tensor.At(i++));
}
}
示例8: At
double At(int index) {return prob_tensor->At(index); }
示例9: Multiply
// multiply two tensors, store result in result_tensor which is assumed to be uninitialized
void Tensor::Multiply(Tensor& result_tensor, Tensor& t1, Tensor& t2, vector<int>& mult_modes1, vector<int>& mult_modes2)
{
assert(mult_modes1.size() == mult_modes2.size());
if (t1.Order() == mult_modes1.size() && t2.Order() == mult_modes2.size())
{
double val = InnerProduct(t1, t2);
vector<int> fake_dims;
result_tensor.Initialize(fake_dims);
result_tensor.Set(0, val);
return;
}
int numMultElements = 1;
vector<int> mult_dims(mult_modes1.size(), 0);
for (int i = 0; i < mult_modes1.size(); ++i)
{
assert(t1.Dim(mult_modes1[i]) == t2.Dim(mult_modes2[i]));
mult_dims[i] = t1.Dim(mult_modes1[i]);
numMultElements = numMultElements * mult_dims[i];
}
vector<int> mult_offsets;
ComputeOffsets(mult_offsets, mult_dims);
int result_order = t1.Order() + t2.Order() - mult_modes1.size() - mult_modes2.size();
if (result_order == 0)
assert(0);
vector<int> result_dims;
vector<int> free_modes1;
vector<int> free_modes2;
// find free indices from t1
for (int i = 0; i < t1.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modes1, i))
{
result_dims.push_back(t1.Dim(i));
free_modes1.push_back(i);
}
}
// find free indices from t2
for (int i = 0; i < t2.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modes2, i))
{
result_dims.push_back(t2.Dim(i));
free_modes2.push_back(i);
}
}
// initialize result_tensor
result_tensor.Initialize(result_dims);
// fill in elements from result tensor
FastIndexer result_indexer(result_dims);
for (int n = 0; n < result_tensor.NumElements(); ++n)
{
vector<int>& indices = result_indexer.GetNext();
vector<int> free_indices1;
vector<int> free_indices2;
// result_tensor.ComputeIndexArray(indices, n);
for (int i = 0; i < result_tensor.Order(); ++i)
{
if (i < free_modes1.size())
free_indices1.push_back(indices[i]);
else
free_indices2.push_back(indices[i]);
}
// sum over elementwise products of mult-mode elements
double temp_sum = 0;
FastIndexer mult_indexer(mult_dims);
for (int k = 0; k < numMultElements; ++k)
{
vector<int>& mult_indices = mult_indexer.GetNext();
// ComputeIndexArray(mult_indices, mult_offsets, k);
vector<int> indices1;
vector<int> indices2;
MergeIndices(indices1, mult_modes1, free_modes1, mult_indices, free_indices1);
MergeIndices(indices2, mult_modes2, free_modes2, mult_indices, free_indices2);
temp_sum += t1.At(indices1) * t2.At(indices2);
}
result_tensor.Set(n, temp_sum);
}
}
示例10: ElementwiseMultiply
void Tensor::ElementwiseMultiply(Tensor& result_tensor, Tensor& t1, Tensor& t2, vector<int>& mult_modes1, vector<int>& mult_modes2)
{
assert(mult_modes1.size() == mult_modes2.size());
int numMultElements = 1;
vector<int> mult_dims(mult_modes1.size(), 0);
for (int i = 0; i < mult_modes1.size(); ++i)
{
assert(t1.Dim(mult_modes1[i]) == t2.Dim(mult_modes2[i]));
mult_dims[i] = t1.Dim(mult_modes1[i]);
numMultElements = numMultElements * mult_dims[i];
}
vector<int> mult_offsets;
ComputeOffsets(mult_offsets, mult_dims);
int result_order = t1.Order() + t2.Order() - mult_modes2.size();
if (result_order == 0)
assert(0);
vector<int> result_dims;
vector<int> free_modes1;
vector<int> free_modes2;
// find free indices from t1
for (int i = 0; i < t1.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modes1, i))
{
free_modes1.push_back(i);
}
}
// find free indices from t2
for (int i = 0; i < t2.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modes2, i))
{
free_modes2.push_back(i);
}
}
int curr_index = 0;
for (int i = 0; i < result_order; ++i)
{
if (i < t1.Order())
{
result_dims.push_back(t1.Dim(i));
}
else
{
result_dims.push_back(t2.Dim(free_modes2[curr_index++]));
}
}
// initialize result_tensor
result_tensor.Initialize(result_dims);
// fill in elements from result tensor
FastIndexer indexer(result_dims);
int n = 0;
while (indexer.HasNext())
{
vector<int>& indices = indexer.GetNext();
vector<int> indices1(t1.Order(), 0);
vector<int> free_indices2;
// result_tensor.ComputeIndexArray(indices, n);
for (int i = 0; i < result_tensor.Order(); ++i)
{
if (i < t1.Order())
indices1[i] = indices[i];
else
free_indices2.push_back(indices[i]);
}
vector<int> mult_indices;
VectorPlus::Subset(mult_indices, indices1, mult_modes1);
vector<int> indices2;
MergeIndices(indices2, mult_modes2, free_modes2, mult_indices, free_indices2);
double val = 0;
double val1 = t1.At(indices1);
if (val1 != 0)
{
val = val1 * t2.At(indices2);
}
result_tensor.Set(n++, val);
}
}
示例11: CreateLinearSystem
void Tensor::CreateLinearSystem(vector<double>& B_vec, Matrix& A_matrix,
Tensor& X, Tensor& A, Tensor& B,
vector<int>& mult_modesX, vector<int>& mult_modesA)
{
// fake multiply x and A together to create B, creating the linear system in the process
assert(mult_modesX.size() == mult_modesA.size());
if (X.Order() == mult_modesX.size() && A.Order() == mult_modesA.size())
{
assert(0);
}
int numMultElements = 1;
vector<int> mult_dims(mult_modesX.size(), 0);
for (int i = 0; i < mult_modesX.size(); ++i)
{
assert(X.Dim(mult_modesX[i]) == A.Dim(mult_modesA[i]));
mult_dims[i] = X.Dim(mult_modesX[i]);
numMultElements = numMultElements * mult_dims[i];
}
vector<int> mult_offsets;
ComputeOffsets(mult_offsets, mult_dims);
int result_order = X.Order() + A.Order() - mult_modesX.size() - mult_modesA.size();
if (result_order == 0)
assert(0);
vector<int> result_dims;
vector<int> free_modesX;
vector<int> free_modesA;
// find free indices from X
for (int i = 0; i < X.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modesX, i))
{
free_modesX.push_back(i);
}
}
// find free indices from A
for (int i = 0; i < A.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modesA, i))
{
free_modesA.push_back(i);
}
}
vector<int> a_mat_dims = VectorPlus::CreatePair(B.NumElements(), X.NumElements());
A_matrix.Initialize(a_mat_dims);
B_vec.reserve(B.NumElements());
// fill in elements from result tensor
FastIndexer B_indexer(B.Dims());
for (int n = 0; n < B.NumElements(); ++n)
{
B_vec.push_back(B.At(n));
vector<int>& indices = B_indexer.GetNext();
vector<int> free_indicesX;
vector<int> free_indicesA;
// B.ComputeIndexArray(indices, n);
for (int i = 0; i < B.Order(); ++i)
{
if (!VectorPlus::Contains(mult_modesX, i))
free_indicesX.push_back(indices[i]);
else
free_indicesA.push_back(indices[i]);
}
// sum over elementwise products of mult-mode elements
double temp_sum = 0;
FastIndexer mult_indexer(mult_dims);
for (int k = 0; k < numMultElements; ++k)
{
vector<int>& mult_indices = mult_indexer.GetNext();
// ComputeIndexArray(mult_indices, mult_offsets, k);
vector<int> indicesX;
vector<int> indicesA;
MergeIndices(indicesX, mult_modesX, free_modesX, mult_indices, free_indicesX);
MergeIndices(indicesA, mult_modesA, free_modesA, mult_indices, free_indicesA);
A_matrix.Set(n, X.ComputeIndex(indicesX), A.At(indicesA));
}
}
}