5

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.

santobedi
  • 866
  • 3
  • 17
  • 39

1 Answers1

5

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
}
Isai Damier
  • 976
  • 6
  • 8
  • try declaring your matrices as final variables. And if you are overwriting them somewhere, you will know. – Isai Damier Nov 15 '19 at 23:16
  • The main cause of the problem was overwriting. Although `getP` is a private method, it is called from a public method which itself was called from the next MainActicity class (multiple times). The clue `overwriting` helped me a lot. – santobedi Nov 19 '19 at 04:56