dot production
来源:互联网 发布:牌子秃黄油 知乎 编辑:程序博客网 时间:2024/04/29 18:41
希望下面的是对的
矩阵点乘 dot production
http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=156079&fromuid=109727
扫描短的然后短的坐标不是0就去看看长的是不是0有待讨论
表示方法用(index, value)如果是两个差不多长的 那么就存到哈希表里然后对于一组元素建立好之后 遍历另一组然后查询对应的index有没有
如果是一个长一个短 那么就用数组把长的(index, value)建立起来然后短的每个元素二分查找
如果把一维向量扩展到二维的矩阵如果要存数组的话 就可以用公式把坐标换成一维的
r,c 变成 r*列数 + c变回来的话 用i/列数, i%列数
package array;import java.util.*;public class DotProduction {public static void main(String[] args){int[] array1 = {0,2,3,0,4,5,0,0};int[] array2 = {2,0,1,0,8,0,0};System.out.println(production1(array1, array2));System.out.println(production2(array1, array2));int[][] m1 = {{0,1,4,5},{0,0,2,0},{4,8,2,0},{1,0,3,1}};int[][] m2 = {{0,0,0,1},{1,0,1,0},{0,0,0,1},{0,0,1,0}};System.out.println(production3(m1, m2));}private static int production1(int[] array1, int[] array2) {if (array1 == null || array1.length == 0 || array2 == null || array2.length == 0) {return 0;}int sum = 0;for (int i = 0; i < array1.length && i < array2.length; i++) {if (array1[i] != 0 && array2[i] != 0) {sum = sum + array1[i]*array2[i];}}return sum;}private static int production2(int[] array1, int[] array2) {if (array1 == null || array1.length == 0 || array2 == null || array2.length == 0) {return 0;}int sum = 0;Map<Integer/*index*/, Integer/*value*/> map1 = new HashMap<>();for (int i = 0; i < array1.length; i++) {if (array1[i] != 0) {map1.put(i, array1[i]);}}for (int i = 0; i < array2.length; i++) {if (array2[i] != 0 && map1.containsKey(i)) {sum = sum + array2[i]*map1.get(i);}}return sum;}//我们假设这是两个n*n的矩阵private static int production3(int[][] matrix1, int[][] matrix2) {if (matrix1 == null || matrix1.length == 0 || matrix2 == null || matrix2.length == 0) {return 0;}int sum = 0;List<Integer/*index*/> l1 = new ArrayList<>();List<Integer/*index*/> l2 = new ArrayList<>();int n = matrix1.length;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (matrix1[i][j] != 0) {l1.add(i*n+j);}}}for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (matrix2[i][j] != 0) {l2.add(i*n+j);}}}for (int i: l2) {int start = l1.get(0);int end = l1.get(l1.size() - 1);if (i < start || i > end) {continue;}while (start + 1 < end) {int mid = start + (end - start) / 2;if (mid == i) {int x = mid/n;int y = mid%n;sum = sum + matrix1[x][y] * matrix2[x][y];break;} else if (mid < i) {start = mid;} else {end = mid;}}if (i == start || i == end) {int x = i/n;int y = i%n;sum = sum + matrix1[x][y] * matrix2[x][y];}}return sum;}}
0 0
- dot production
- Prototype&Production
- Ruby production
- ZOJ3750 Dot Dot Dot 枚举状态+BFS
- Dot bat
- dot emacs
- Dot Notation
- Dot Notation
- dot guide
- dot example
- dot 学习
- dot安装
- DOT语言
- dot.js
- dot语法
- dot.js
- doT.js
- doT.js
- 杭电-2066 一个人的旅行(Floyd&&dijkstra)
- Radix树 与 Linux IDR机制
- malloc和calloc
- eclipse点击android模拟器按钮输出SDK Manager] Error: Error parsing
- 数字图像MATLAB版自学导向
- dot production
- 函数指针的一种用法
- C语言基础学习教程
- According to TLD or attribute directive in tag file, attribute value does not accept any expressions
- HDU 5441(并查集)
- hdu4006
- 解决-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variabl
- XENSERVER的IPTABLES
- leetcode_c++:Roman to Integer(013)