Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 链矩阵乘法:乘法算法不工作_Java_Algorithm_Matrix_Data Structures - Fatal编程技术网

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[][];

我已经实现了链式矩阵乘法。虽然我得到了正确的链式顺序,但在执行实际乘法时,给定的乘法算法不能正常工作。我的Java代码:-

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);