我试图让子矩阵将两个矩阵乘以一个矩阵。我已经获得了伪代码,因此所有尝试找到在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×n矩阵,因此它们可以由大小为n ^ 2的常规数组表示。矩阵(0索引)时代的系数Cij在数组a中以[in + j]进行访问。
我的任务是实现两个版本:一个将子矩阵复制到新数组中,另一个使用两个索引变量来设置矩阵的哪个部分正在使用
答案 0 :(得分:0)
以下是SparceMatrix Multiplication的实现
稀疏表示的向量类:
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);