androidandroid-studiomatrixmatrix-multiplicationjama

Why does the Jama matrix inner dimension agree in the first iteration, but later it does not?


Following Jama Matrices are defined in my code:

P: 3*3 Matrix
I: 3*3 identity Matrix
K: 3*2 Matrix
H: 2*3 Matrix
Q: 3*3 Matrix

Following is my code snippet:

private Matrix getP() {
        P= (I.minus(K.times(H))).times(Q);
        Log.d("csv", "P is calculated");
        return P;
    }

While running the code, at first iteration it works, i.e, P is calculated is printed at the Logcat. However, it happens only once and the application gets stopped. Following is the error:

 java.lang.IllegalArgumentException: Matrix inner dimensions must agree.

If the Matrix inner dimension was the error, how come it runs for the first iteration? I obtained some information about the inner dimension at this link. However, I could not figure out the solution. When the equation is manually checked, the matrix dimension matches. Anything wrong with my approach??

Thank you.


Solution

  • Do you mind showing how you are calling getP? The following works no matter how many times I click on the fab button.

    class MainActivity : AppCompatActivity() {
    
        val I = Matrix.identity(3,3)
        val K = Matrix(3,2,5.0)
        val H = Matrix(2,3,7.0)
        val Q = Matrix(3,3,8.0)
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            fab.setOnClickListener { view ->
                getP()
            }
        }
    
        private fun getP():Matrix{
            val P = (I.minus(K.times(H))).times(Q)
            Log.d("MainActivity","P is calculated")
            return P
        }
    }
    

    When getP returns where are you storing the results? Are you possibly overwriting one of the matrices?

    Update

    If your situation is such that making the variables final is not an option for you, then you can log each matrix's dimension and then debug the one that changes.

    private fun getP():Matrix{
        Log.d(TAG,"I dimension: ${I.rowDimension} x ${I.columnDimension}")
        Log.d(TAG,"K dimension: ${K.rowDimension} x ${K.columnDimension}")
        Log.d(TAG,"H dimension: ${H.rowDimension} x ${H.columnDimension}")
        Log.d(TAG,"Q dimension: ${Q.rowDimension} x ${Q.columnDimension}")
    
        val P = (I.minus(K.times(H))).times(Q)
        Log.d(TAG,"P is calculated")
        return P
    }