Java 链矩阵乘法:乘法算法不工作
我已经实现了链式矩阵乘法。虽然我得到了正确的链式顺序,但在执行实际乘法时,给定的乘法算法不能正常工作。我的Java代码:-Java 链矩阵乘法:乘法算法不工作,java,algorithm,matrix,data-structures,Java,Algorithm,Matrix,Data Structures,我已经实现了链式矩阵乘法。虽然我得到了正确的链式顺序,但在执行实际乘法时,给定的乘法算法不能正常工作。我的Java代码:- package algopackage; import java.util.ArrayList; import java.util.List; public class ChainMatrixMultiplication { static int s[][]; static int x[][]; static int y[][];
package algopackage;
import java.util.ArrayList;
import java.util.List;
public class ChainMatrixMultiplication {
static int s[][];
static int x[][];
static int y[][];
public ChainMatrixMultiplication() {
}
static void chainMatrixMultiplication(int[] p) {
boolean isFirst = false;
int n = p.length-1;
int m[][] = new int[n][n];
s = new int[n][n];
for (int c = 0; c < n; c++)
m[c][c] = 0;
for (int counter = 1; counter < n; counter++) {
for (int i = 0;i < n; i++) {
isFirst = false;
int j = i + counter;
for (int k = i; k < j && j < n; k++) {
int result = m[i][k] + m[k+1][j] + p[i] * p[k+1] * p[j+1];
if (!isFirst) {
m[i][j] = result;
s[i][j] = k;
isFirst = true;
} else if (m[i][j] > result) {
m[i][j] = result;
s[i][j] = k;
}
}
}
}
}
static int[][] matrixMultiply(List<Matrix> matrices, int s[][], int i ,int j) {
if (i ==j) return matrices.get(i).getMatrix();
else {
int k = s[i][j];
x = matrixMultiply(matrices, s, i, k);
y = matrixMultiply(matrices, s, k+1, j);
return mult(x,y);
}
}
static int[][] mult(int[][] x, int[][] y) {
int [][] result = new int[x.length][y[0].length];
/* Loop through each and get product, then sum up and store the value */
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < y[0].length; j++) {
for (int k = 0; k < x[0].length; k++) {
result[i][j] += x[i][k] * y[k][j];
}
}
}
return result;
}
public static void main(String[] args) {
int p[] = {5,4,6,2};
List<Matrix> matrices = new ArrayList<Matrix>();
Matrix m1 = new Matrix(5,4);
int arr[] = {1,2,40,2,3,29,10,21,11,120,23,90,24,12,11,1,11,45,23,21};
m1.addElementsToMatrix(5, 4, arr);
Matrix m2 = new Matrix(4,6);
int arr1[] = {1,1,1,2,3,12,12,3,10,12,12,29,22,11,22,11,11,11,13,1,2,12,4,2};
m2.addElementsToMatrix(4, 6, arr1);
Matrix m3 = new Matrix(6,2);
int arr2[] = {1,1,12,3,22,11,13,1,2,12,12,12};
m3.addElementsToMatrix(6, 2, arr2);
matrices.add(m1);
matrices.add(m2);
matrices.add(m3);
chainMatrixMultiplication(p);
matrixMultiply(matrices,s,0,2);
}
}
class Matrix {
private final int[][] matrix;
public Matrix(int rows, int cols) {
this.matrix = new int[rows][cols];
}
public void addElementsToMatrix(int rows, int cols, int[] arr) {
int counter = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = arr[counter++];
}
}
}
public int[][] getMatrix() {
return matrix;
}
}
package;
导入java.util.ArrayList;
导入java.util.List;
公共类链矩阵乘法{
静态int s[][];
静态int x[][];
静态int y[][];
公共链矩阵乘法(){
}
静态无效链矩阵乘法(int[]p){
布尔值isFirst=false;
int n=p.length-1;
int m[][]=新的int[n][n];
s=新整数[n][n];
for(int c=0;c结果){
m[i][j]=结果;
s[i][j]=k;
}
}
}
}
}
静态int[][]矩阵多重(列表矩阵,int s[][],int i,int j){
if(i==j)返回矩阵.get(i).getMatrix();
否则{
int k=s[i][j];
x=矩阵乘(矩阵,s,i,k);
y=矩阵的倍数(矩阵,s,k+1,j);
返回mult(x,y);
}
}
静态int[]mult(int[]x,int[]y){
int[][]结果=新的int[x.length][y[0].length];
/*循环遍历每一项并得到乘积,然后求和并存储值*/
对于(inti=0;i
在上面的代码中,matrixMultiply()函数正在引发异常。由于矩阵未按预期相乘,导致异常。As递归的行为不符合预期。我在这段代码中遗漏了一些东西。任何帮助都将不胜感激。谢谢 我不确定你的代码是否正确,但看看矩阵乘法输出,当你将a*b和c*d的矩阵相乘后,通过改变
for (int k = 0; k < x[0].length; k++) {
for(int k=0;k
到
for(int k=0;k
应解决此问题。此:
x = matrixMultiply(matrices, s, i, k); // call A
y = matrixMultiply(matrices, s, k+1, j); // call B
return mult(x,y);
看起来它应该将调用A的结果乘以调用B的结果。但一般来说,它不会
x
不是本地的,呼叫B通常会覆盖它,除非呼叫B立即命中基本情况
这种情况往往发生在您将数据“传递到另一端”时,而不是作为函数参数或函数返回值。始终避免这种数据流是不合理的,但您应该在这里避免它,特别是因为它甚至不是您想要的。问题是由于matrixMultiply()函数中的矩阵没有按正确的顺序相乘。mult()函数工作正常。是的……但我不明白你所说的“将数据传递到一边”是什么意思。另外,你能建议更改以使其正常工作吗?谢谢!@Batman“不作为函数参数或函数返回值”。只需将
x
和y
设置为本地。谢谢!它起作用了。我没有注意静态x&y。再次感谢!
x = matrixMultiply(matrices, s, i, k); // call A
y = matrixMultiply(matrices, s, k+1, j); // call B
return mult(x,y);