Permalink
Browse files

Matrix Multiply Vector

Coding implementation:
n order Matrix multiply n order Vector
return n order Vector.

Use google test as unit test framework.
  • Loading branch information...
1 parent 297c01b commit be829bc4514aa676d11b4dac39e6cbc1bc004dd1 @elixir67 committed May 13, 2012
View
@@ -0,0 +1,151 @@
+// Matrix.cpp : Defines the entry point for the console application.
+//
+
+//Given the following Matrix and Vector, what is the result:
+//
+//3 1 5 6 38
+//2 1 4 x 5 = 29
+//2 4 3 3 41
+//
+
+
+#include "stdafx.h"
+#include <iostream>
+#include <math.h>
+#include <assert.h>
+using namespace std;
+
+#include <gtest\gtest.h>
+
+class Vector;
+// n Order Matrics
+class Matrix
+{
+public:
+ Matrix(int* p, int order)
+ {
+ m_order = order;
+ m_data = new int[order*order];
+ for(int row = 0; row < m_order; ++row)
+ {
+ for(int column = 0; column < m_order; ++column)
+ {
+ m_data[row*m_order + column] = *(p++);
+ }
+ }
+ cout << "Matrix is constructed!"<<endl;
+ }
+
+ ~Matrix()
+ {
+ delete[] m_data;
+ }
+
+ void Output()
+ {
+ cout << "Matrix content: " << endl;
+ for(int row = 0; row < m_order; ++row)
+ {
+ for(int column = 0; column < m_order; ++column)
+ cout << m_data[row*m_order + column] << " ";
+ cout << endl;
+ }
+ }
+
+ Vector * Multiply(const Vector & v);
+
+private:
+ int * m_data;
+ int m_order;
+};
+
+// n order Vector
+class Vector
+{
+public:
+ Vector(int * p, int length)
+ {
+ m_order = length;
+ m_data = new int[length];
+ for(int i = 0; i < length; i++)
+ m_data[i] = *(p++);
+ cout << "Vector is constructed" << endl;
+ }
+
+ ~Vector()
+ {
+ delete[] m_data;
+ }
+
+ void Output()
+ {
+ cout << "Vector content: " << endl;
+ for(int i = 0; i < m_order; ++i)
+ cout << m_data[i] << endl;
+ cout << endl;
+ }
+
+ bool operator==(Vector & rhs)const
+ {
+ if(m_order != rhs.m_order)
+ return false;
+ for(int i = 0; i < m_order; i++)
+ if(m_data[i] != rhs.m_data[i])
+ return false;
+ return true;
+ }
+
+ friend Vector * Matrix::Multiply(const Vector &v);
+
+private:
+ int * m_data;
+ int m_order;
+};
+
+Vector * Matrix::Multiply(const Vector & v)
+{
+ assert(m_order == v.m_order);
+ if(m_order != v.m_order)
+ return NULL;
+
+ int * r = new int[m_order];
+ for(int i = 0; i < m_order; ++i)
+ r[i] = 0;
+ for(int row = 0; row < m_order; ++row)
+ for(int colum = 0; colum < m_order; ++colum)
+ r[row] += m_data[row * m_order + colum]*v.m_data[colum];
+
+ cout << "The result after Matrix multiplied Vector:" << endl;
+ for(int i = 0; i < m_order; ++i)
+ cout << r[i] << endl;
+
+ Vector * rv = new Vector(r, m_order);
+ return rv;
+}
+
+TEST(MatrixTest, InputOutput)
+{
+ int ma[] = {3,1,5,
+ 2,1,4,
+ 2,4,3};
+ Matrix m(ma, 3);
+ int va[] = {6, 5, 3};
+ Vector v(va, 3);
+ m.Output();
+ v.Output();
+ unique_ptr<Vector> r(m.Multiply(v));
+ r->Output();
+
+ int eva[] = {38, 29, 41};
+ Vector ev(eva, 3);
+ ASSERT_TRUE(ev == *r);
+
+ SUCCEED();
+}
+
+int _tmain(int argc, _TCHAR* argv[])
+{
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
+
View
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Matrix", "Matrix.vcxproj", "{03A8E47C-4AC0-448D-B9DE-826E51354A18}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {03A8E47C-4AC0-448D-B9DE-826E51354A18}.Debug|Win32.ActiveCfg = Debug|Win32
+ {03A8E47C-4AC0-448D-B9DE-826E51354A18}.Debug|Win32.Build.0 = Debug|Win32
+ {03A8E47C-4AC0-448D-B9DE-826E51354A18}.Release|Win32.ActiveCfg = Release|Win32
+ {03A8E47C-4AC0-448D-B9DE-826E51354A18}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{03A8E47C-4AC0-448D-B9DE-826E51354A18}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ <RootNamespace>Matrix</RootNamespace>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>E:\gtest-1.6.0\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalLibraryDirectories>E:\gtest-1.6.0\lib\Win32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+ <AdditionalDependencies>gtestd.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <PrecompiledHeader>Use</PrecompiledHeader>
+ <Optimization>MaxSpeed</Optimization>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <None Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="stdafx.h" />
+ <ClInclude Include="targetver.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="Matrix.cpp" />
+ <ClCompile Include="stdafx.cpp">
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+ <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+ </ClCompile>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project>
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="ReadMe.txt" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="stdafx.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="targetver.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="stdafx.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="Matrix.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project>
View
@@ -0,0 +1,40 @@
+========================================================================
+ CONSOLE APPLICATION : Matrix Project Overview
+========================================================================
+
+AppWizard has created this Matrix application for you.
+
+This file contains a summary of what you will find in each of the files that
+make up your Matrix application.
+
+
+Matrix.vcxproj
+ This is the main project file for VC++ projects generated using an Application Wizard.
+ It contains information about the version of Visual C++ that generated the file, and
+ information about the platforms, configurations, and project features selected with the
+ Application Wizard.
+
+Matrix.vcxproj.filters
+ This is the filters file for VC++ projects generated using an Application Wizard.
+ It contains information about the association between the files in your project
+ and the filters. This association is used in the IDE to show grouping of files with
+ similar extensions under a specific node (for e.g. ".cpp" files are associated with the
+ "Source Files" filter).
+
+Matrix.cpp
+ This is the main application source file.
+
+/////////////////////////////////////////////////////////////////////////////
+Other standard files:
+
+StdAfx.h, StdAfx.cpp
+ These files are used to build a precompiled header (PCH) file
+ named Matrix.pch and a precompiled types file named StdAfx.obj.
+
+/////////////////////////////////////////////////////////////////////////////
+Other notes:
+
+AppWizard uses "TODO:" comments to indicate parts of the source code you
+should add to or customize.
+
+/////////////////////////////////////////////////////////////////////////////
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// Matrix.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
View
@@ -0,0 +1,15 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+#include "targetver.h"
+
+#include <stdio.h>
+#include <tchar.h>
+
+
+
+// TODO: reference additional headers your program requires here
@@ -0,0 +1,8 @@
+#pragma once
+
+// Including SDKDDKVer.h defines the highest available Windows platform.
+
+// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
+// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
+
+#include <SDKDDKVer.h>

0 comments on commit be829bc

Please sign in to comment.