Skip to content

Commit

Permalink
Implemented matrix multiplication (vector * vector,vector * matrix,ma…
Browse files Browse the repository at this point in the history
…trix*vector,matrix*matrix).

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@734 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
ankar committed Feb 14, 2002
1 parent 3d5d12d commit 563b2d7
Show file tree
Hide file tree
Showing 6 changed files with 374 additions and 196 deletions.
5 changes: 5 additions & 0 deletions mosh/src/modelica_type.cpp
Expand Up @@ -184,6 +184,11 @@ void modelica_type::set_function_argument()
m_type = function_argument_t;
}

std::vector<int> modelica_type::dimensions() const
{
return m_dimensions;
}

bool modelica_type::type_equal(modelica_type t)
{
if (m_type == t.m_type)
Expand Down
2 changes: 2 additions & 0 deletions mosh/src/modelica_type.hpp
Expand Up @@ -49,6 +49,8 @@ class modelica_type

bool type_equal(modelica_type t);

std::vector<int> dimensions() const;

friend modelica_type create_real();
friend modelica_type create_integer();
friend modelica_type create_string();
Expand Down
76 changes: 64 additions & 12 deletions mosh/src/runtime/numerical_array.hpp
Expand Up @@ -38,13 +38,16 @@ class numerical_array : public modelica_array<Tp>

numerical_array<Tp>& operator*= (const numerical_array<Tp>& arr);

//numerical_array<Tp> operator* (const numerical_array<Tp>& arr) const;
numerical_array<Tp> operator* (const numerical_array<Tp>& arr) const;
numerical_array<Tp>& operator*= (const Tp& s);
numerical_array<Tp> operator* (const Tp& s);

numerical_array<Tp>& operator/= (const Tp& s);
numerical_array<Tp> operator/ (const Tp& s);

friend Tp mul_vector_vector<Tp>(const numerical_array<Tp>& v1,const numerical_array<Tp>& v2);
friend numerical_array<Tp> mul_vector_matrix<Tp>(const numerical_array<Tp>& v1, const numerical_array<Tp>& v2);
friend numerical_array<Tp> mul_matrix_vector<Tp>(const numerical_array<Tp>& v1, const numerical_array<Tp>& v2);

numerical_array() {};
numerical_array(std::vector<int> dims) : modelica_array<Tp>(dims) {};
Expand Down Expand Up @@ -159,12 +162,12 @@ numerical_array<Tp> numerical_array<Tp>::operator* (const numerical_array<Tp>& a
assert(m_dim_size[1] == arr.m_dim_size[0]);

int i_size = m_dim_size[0];
int j_size = m_dim_size[1];
int k_size = arr.m_dim_size[1];
int j_size = arr.m_dim_size[1];
int k_size = m_dim_size[1];

std::vector<int> result_dims;
result_dims.push_back(i_size);
result_dims.push_back(k_size);
std::vector<int> result_dims(2);
result_dims[0] = i_size; // Number of rows in result
result_dims[1] = j_size; // Number of cols in result

numerical_array<Tp> result(result_dims);
for (int i = 0; i < i_size; ++i)
Expand Down Expand Up @@ -199,16 +202,46 @@ numerical_array<Tp> mul_vector_matrix(const numerical_array<Tp>& v1, const numer
assert(v2.ndims() == 2);
assert(v1.m_dim_size[0] == v2.m_dim_size[0]);

std::vector<Tp>::const_iterator it = v2.m_data.begin();

int i_size = v2.m_dim_size[1];
int j_size = v2.m_dim_size[0];

numerical_array<Tp> result(std::vector<int>(1,v2.m_dim_size[1]));
for (; it != v2.m_data.end();++it)

for (int i = 0; i < i_size; ++i)
{
Tp tmp = static_cast<Tp>(0);
for (int j = 0; j < j_size; ++j)
{
tmp += v1.m_data[j]*v2.m_data[j*i_size+i];
}
result.m_data[i] = tmp;
}

return result;
}

template<typename Tp>
numerical_array<Tp> mul_matrix_vector(const numerical_array<Tp>& v1, const numerical_array<Tp>& v2)
{
assert(v1.ndims() == 2);
assert(v2.ndims() == 1);
assert(v1.m_dim_size[1] == v2.m_dim_size[0]);

int i_size = v1.m_dim_size[0];
int j_size = v1.m_dim_size[1];

numerical_array<Tp> result(std::vector<int>(1,v1.m_dim_size[0]));

for (int i = 0; i < i_size; ++i)
{
Tp element = std::inner_product(v1.m_data.begin(),v1.m_data.end(),it,static_cast<Tp>(0));
result.m_data.push_back(element);
Tp tmp = static_cast<Tp>(0);
for (int j = 0; j < j_size; ++j)
{
tmp += v1.m_data[i*j_size+j]*v2.m_data[j];
}
result.m_data[i] = tmp;
}

assert(result.m_data.size() == v2.m_dim_size[1]);
return result;
}

Expand Down Expand Up @@ -253,6 +286,25 @@ numerical_array<Tp> numerical_array<Tp>::operator * (const Tp& s)
return tmp;
}

template<typename Tp>
numerical_array<Tp>& numerical_array<Tp>::operator/= (const Tp& s)
{
for (size_t i = 0; i < m_data.size(); ++i)
{
m_data[i] /= s;
}
return *this;
}

template<typename Tp>
numerical_array<Tp> numerical_array<Tp>::operator/ (const Tp& s)
{
numerical_array tmp(*this);

tmp *= s;
return tmp;
}

class real_array : public numerical_array<double>
{
public:
Expand Down

0 comments on commit 563b2d7

Please sign in to comment.