square-matrix-multiply-recursive java implementation



我正在尝试使子膜将两个矩阵乘以一个。我已经获得了伪代码,因此所有试图找到在Java中实现它的正确方法的尝试,我仍然陷入基础知识上。此pseoudocode的Java代码的整体结构是什么样的?

SQUARE-MATRIX-MULTITPLY-RECURSIVE(A,B)
n = A.rows
let C be a n x n matrix 
if n == 1  
   c11 = a11 * b11
else partition A, B and C
     C11 = SQURAE-MATRIX-MULTIPLY.RECURSIVE(A11,B11)
          + SQUARE-MARTIX-MULTIPLY-RECURSIVE(A12,B21)
     C12 = SQUARE-MATRIX-MULTIPLY-RECURSUÌVE(A11,B12)
          + SQUARE-MATRIX-MULTIPLY-RECURSIVE(A11,B12)
     C21 = SQUARE-MATRIX-MULTIPLY-RECURSUÌVE(A12,B22)
          + SQUARE-MATRIX-MULTIPLY-RECURSUÌVE(A22,B21)
     C22 = SQUARE-MATRIX-MULTIPLY-RECURSUÌVE()A21,B12)
          + SQUARE-MATRIX-MULTIPLY-RECURSUÌVE(A22,B22)
     return C;

由于矩阵A和B是N x n矩阵,因此可以用尺寸n^2的常规阵列表示。矩阵中的系数cij(0索引)时代在数组a中访问了[in j]。

我的任务是实现两个版本:一个将子膜复制到新数组中,一个使用两个索引变量来设置正在使用矩阵的部分

这是sparcematrix乘法的实现

稀疏表示的矢量类:

public class SparseVector {
    private HashST<Integer, Double> st;
    public SparseVector() {
        st = new HashST<Integer, Double>();
    }
    public int size() {
        return st.size();
    }
    public void put(int i, double x) {
        st.put(i, x);
    }
    public double get(int i) {
        if (!st.contains(i))
            return 0.0;
        else
            return st.get(i);
    }
    public double dot(double[] that) {
        double sum = 0.0;
        for (int i : st.keys())
            sum += that[i] * this.get(i);
        return sum;
    }
}

主要方法/呼叫代码:

SparseVector[] a;
a = new SparseVector[N];
double[] x = new double[N];
double[] b = new double[N]; // Initialize a[] and x[]. ...
for (int i = 0; i < N; i++)
    b[i] = a[i].dot(x);

最新更新