##矩阵乘法

####1、如果是两个矩阵相乘,必须保证A*B A矩阵的行数和B矩阵的列数相同

##相乘结果

##java方法实现随机矩阵,矩阵相乘等工作.

矩阵相乘想到的实现方式:(目前使用循环的方式来实现,下一步慢慢的采用下面的方式来实现效果)

####1、采用多线程的方式来做这个矩阵的乘法 ####2、采用master-worker的方式来做. ####3、hadoop Map-Reduce.

package com.wendy.test.matrix;

import java.util.Random;

/** 
 * 
 * 此工具类可以生成矩阵,计算两个矩阵的乘法. <b>NOTE:</b>
 * <p>
 * <b> 此矩阵中的算法只是简单的算法,需要优化</b>
 * </p>
 * 
 * <p>
 * <dl>
 * <dt>想到的方法:</dt>
 * <dd>采用多线程的方式来做这个矩阵的乘法.</dd>
 * <dd>采用master-worker的方式来做.</dd>
 * <dd>hadoop Map-Reduce.</dd>
 * </p>
 * 
 * 
 * 
 * <b>time:</b>2015年3月13日
 *
 * @author admin
 *
 */
public class MatrixUtil {
	private static Random random = new Random();

	private MatrixUtil() {

	}

	/**
	 * 查询某个数字在矩阵中出现的次数.
	 * 
	 * @param matrix 二维数组.
	 * @param element 需要查找的元素.
	 * @return 次数.
	 */
	public static int count(int[][] matrix, int element) {
		if (matrix == null) {
			throw new NullPointerException("你输入的matirx为null哦!");
		}

		int count = 0;
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) {
				if (matrix[i][j] == element) {
					count++;
				}
			}
		}

		return count;
	}

	/**
	 * 计算矩阵a和b的乘法运算. <b>NOTE:</b>&nbsp;a 的行数必须和b的列数相同.
	 * 
	 * @param a
	 *            矩阵A.
	 * @param b
	 *            矩阵B.
	 * @return a X b 的结果.
	 */
	public static int[][] multiMatrix(int[][] a, int[][] b) {
		if (a == null || b == null) {
			System.out.println(" a and b is not null.");
			return null;
		}

		int arows = a.length;
		int bcolumn = b[0].length;
		int matrix[][] = null;
		if (arows == bcolumn) {
			matrix = new int[arows][bcolumn];
			for (int i = 0; i < arows; i++) {
				for (int j = 0; j < bcolumn; j++) {
					for (int k = 0; k < b[0].length; k++) {
						// a[0][1]*b[1][0] a[0][2]*b[2][0]
						matrix[i][j] += a[i][k] * b[k][j];
					}

				}
			}

		} else {
			System.out.println("matrix 乘法规则不清楚哦!");
		}

		return matrix;
	}

	/**
	 * 根据行数和列数生成矩阵.
	 * 
	 * @param column
	 *            列数.
	 * @param rows
	 *            行数.
	 * @param valueRange
	 *            矩阵里取值范围. 0~valueRange.
	 * @return <code>int[][]</code>
	 */
	public static int[][] randomMatrix(int column, int rows, int valueRange) {
		if (rows < 0 || column < 0) {
			System.out.println("Are you blind? ~~");
		}
		int matrix[][] = new int[rows][column];
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) {
				matrix[i][j] = random.nextInt(valueRange);
			}
		}

		return matrix;

	}

	/**
	 * 打印矩阵数据到控制台.
	 * 
	 * @param matrix
	 *            矩阵数组.
	 * @param name
	 *            给矩阵起的小名字.
	 */
	public static void printMatrixData(int[][] matrix, String name) {
		if (matrix == null) {
			System.out.println("you should input nomal matrix data array,ok?");
		}
		System.out.println("矩阵[" + name + "] 大小为:[" + matrix.length + " X "
				+ matrix[0].length + "]");
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) {
				System.out.print(matrix[i][j]);
				System.out.print(" ");
			}
			System.out.println();
		}
	}

	/**
	 * 根据输入参数生成一个二维数组的矩阵.
	 * 
	 * @param size
	 *            矩阵大小在此size以内.
	 * @param valueSize
	 *            矩阵里面的值的大小在此valueSize之内.
	 * @return 生成的矩阵,<code>int[][]</code>
	 */
	public static int[][] randomMatrix(int size, int valueSize) {
		if (size == 0) {
			return new int[0][0];
		}
		int column = random.nextInt(size) + 1;
		int row = random.nextInt(size) + 1;
		int[][] matrix = new int[row][column];

		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix[i].length; j++) {
				matrix[i][j] = random.nextInt(valueSize);
			}
		}

		return matrix;
	}

}