# 2.2.3.9.11 matrixbase::Cross

## Description

Calculate the cross between two matrixs as row wise or column wise

## Syntax

int Cross( matrixbase & mbSource, int nDim = 1 )

## Parameters

mbSource
[input] The source matrix
nDim
[input] Cross product can occur row wise (relative to the first dimension when nDim=1) or column wise (relative to the second dimension when nDim=2)

## Return

Returns 0 on success and a non-zero error code on failure.

## Examples

EX1

void matrixbase_Cross_ex1()
{
int rc;
matrix<double> mat1 = { {1, 2, 3} };
matrix<double> mat2 = { {4, 5, 6} };
rc = mat1.Cross(mat2);  // Multiply mat2 to mat1 (row-wise)

if(rc!=0)
printf("Error: Cross failed. rc=%d\n");
else{
printf("The matrix is:\n");
for(int ii=0; ii< mat1.GetNumRows(); ii++){
for(int jj=0; jj< mat1.GetNumCols(); jj++)
printf("%g  ", mat1[ii][jj]);
printf("\r\n");
}
}
}

EX2

// cross product of two (row) vectors
void matrixbase_Cross_ex2()
{
int rc;

matrix<double> mat1 = { {1, 2, 3} };

matrix<double> mat2 = { {4, 5, 6} };

// mat1 X mat2 (row-wise) =
//   {2*6-3*5, 3*4-1*6, 1*5-2*4}
//   {-3, 6, -3}
//

MatrixPage MatPg1;
MatPg1.Create("Origin");
MatrixLayer MatLy1 = MatPg1.Layers(0);
Matrix Mat1(MatLy1);
Mat1 = mat1;

MatrixPage MatPg2;
MatPg2.Create("Origin");
MatrixLayer MatLy2 = MatPg2.Layers(0);
Matrix Mat2(MatLy2);
Mat2 = mat1;  // Mat2 contents are initially identical to the original mat1

MatrixPage MatPg3;
MatPg3.Create("Origin");
MatrixLayer MatLy3 = MatPg3.Layers(0);
Matrix Mat3(MatLy3);
Mat2 = mat2; // This is used to cross-product on Mat2

rc=mat1.Cross(mat2);  // Multiply mat2 to mat1 (row-wise)
if(rc!=0)
printf("  Error: Cross on %s by %s failed. rc=%d\n",
Mat1.GetName(),Mat2.GetName(),rc);
else
{
Mat3 = mat1;
printf("  %s X %s = %s  (row wise product)\n",
Mat1.GetName(), Mat2.GetName(),Mat3.GetName());
}
}

EX3

// cross product of two matrices (column-wise product)
void matrixbase_Cross_ex3()
{
int rc;

matrix<double> mat1 = {
{1, 1, 2, 3},
{2, 1, 2, 3},
{3, 1, 2, 3}
};

matrix<double> mat2 = {
{4, 4, 5, 6},
{5, 4, 5, 6},
{6, 4, 5, 6}
};

// mat1 X mat2 (column-wise) =
//   {-3, 0  0  0}
//   { 6, 0  0  0}
//   {-3, 0  0  0}
//
//  = transpose( {1 2 3}X(4 5 6) / {1 1 1}X{4 4 4} / {2 2 2}X{5 5 5} / {3 3 3}X{6 6 6} )

MatrixPage MatPg1;
MatPg1.Create("Origin");
MatrixLayer MatLy1 = MatPg1.Layers(0);
Matrix Mat1(MatLy1);
Mat1 = mat1;

MatrixPage MatPg2;
MatPg2.Create("Origin");
MatrixLayer MatLy2 = MatPg2.Layers(0);
Matrix Mat2(MatLy2);
Mat2 = mat1;  // Mat2 contents are initially identical to the original mat1

MatrixPage MatPg3;
MatPg3.Create("Origin");
MatrixLayer MatLy3 = MatPg3.Layers(0);
Matrix Mat3(MatLy3);
Mat2 = mat2; // This is used to cross-product on Mat2

rc=mat1.Cross(mat2, 2);  // Multiply mat2 to mat1 column-wise
if(rc!=0)
printf("  Error: Cross on %s by %s failed. rc=%d\n",
Mat1.GetName(),Mat2.GetName(),rc);
else
{
Mat3 = mat1;
printf("  %s X %s = %s  (column wise product)\n",
Mat1.GetName(), Mat2.GetName(),Mat3.GetName());
}
}

EX4

#define MAKEMAT(X) MatrixLayer MatLy##X;MatLy##X.Create();Matrix Mat##X(MatLy##X)
void matrixbase_Cross_ex4()

{
matrix mat1 = {
{1, 2, 3},
{1, 2, 3},
{1, 2, 3}
};

matrix mat2 = {
{2, 3, 4},
{3, 4, 5},
{4, 5, 6}
};

MAKEMAT(1); MAKEMAT(2); MAKEMAT(3); MAKEMAT(4);
MAKEMAT(5); MAKEMAT(6); MAKEMAT(7);

Mat1=mat1; Mat2=mat2;

Mat3=mat1*mat2;
printf("%s = %s * %s <== proper multiplication of 2 matrices\n",Mat3.GetName(),Mat1.GetName(),Mat2.GetName());

Mat4=mat1*10;
printf("%s = 10 * %s <== scalr multiplication of a matrix\n",Mat4.GetName(),Mat1.GetName());

Mat5=mat1;
Mat5.DotMultiply(mat2);
printf("%s = DotMultiply(%s,%s) <== element-wise multiplication of 2 matrices\n",Mat5.GetName(),Mat1.GetName(),Mat2.GetName());

Mat6=mat1;
Mat6.Cross(mat2);
printf("%s = Cross(%s,%s) <== cross product of 2 matrices\n",Mat6.GetName(),Mat1.GetName(),Mat2.GetName());

mat1.CumulativeProduct(Mat7);
printf("%s = CumulativeProduct(%s) <== cumulative product of a matrix\n",Mat7.GetName(),Mat1.GetName());
}

## Remark

Cross product of this matrix and the source matrix along the dimension identified by nDim. The nDim dimension of both matrices must be three and the underlying base type of the source matrix must be less than or equal to the underlying base type of this matrix.

Note

The following is a summary of various matrix operations:

1) Multiplication:

1-1) * ... Proper multiplication of 2 matrices (mat1*mat2)

1-2) * ... Scaler multiplication of a matrix (mat1*A or A*mat1)

1-3) DotMultiply ... Element-wise multiplication of 2 matrices

1-4) Cross ... Cross product of 2 matrices

1-5) CumulativeProduct ... cumulative product of a matrix

2) Division:

2-1) / ... Not defined for 2 matrices. For proper division, multiply Inverse(mat1)

2-2) / ... Scaler division of a matrix (mat1/A)

2-3) DotDivide ... Element-wise division of 2 matrices

3-1) + ... Element-wise addition of 2 matrices

3-2) + ... Scaler addition of a matrix (mat1+A or A+mat1)

3-3) SumColumns ... Summation of each column in a matrix

3-4) CumulativeSum ... Cumulative product of a matrix

4) Subtraction:

4-1) - ... Element-wise subtraction of 2 matrices

4-2) - ... Scaler subtraction of a matrix (mat1-A or A-mat1)

4-3) Difference ... Difference of adjacent 2 rows in a matrix (1st order differential)

5) Power:

5-1) ^ (or pow) ... Not defined as element-wise power of 2 matrices

5-2) ^ (or pow) ... Not defined as scaler power of a matrix

5-3) DotPower ... Element-wise power of 2 matrices

To depict the differences of above multiplications, try the EX3.