[Closed] Comparing Matrices
the following code returns true:
matrix1 = (matrix3 [1,0,0] [0,0,1] [0,-1,0] [1,1,1])
matrix2 = matrix1
matrix1 == matrix2
Yet this code returns false:
matrix1 = (matrix3 [1,0,0] [0,0,1] [0,-1,0] [1,1,1])
matrix2 = (matrix3 [1,0,0] [0,0,1] [0,-1,0] [1,1,1])
matrix1 == matrix2
I have found a way around this already, so I dont need a solution, but I would like to know why this evaulates the way it does.
If anyone has any ideas please let me know.
Thanks
Matrices, like Arrays, are compound values where the comparison only looks to see if the two variables point at the same memory (in other words, if they are instances). As with arrays, you cannot compare the CONTENT of the value as it does not do a component by component comparison, only a top-level test.
So
a = matrix3 1
-->(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0])
b = a
-->(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0])
a == b
-->true
a.row1 = [0.5,1,1]
-->[0.5,1,1]
b
-->(matrix3 [0.5,1,1] [0,1,0] [0,0,1] [0,0,0])
As you can see changing A changed B because B is a variable whose pointer points at the same memory as A. That’s why the comparison gives true.
But once you make B an independent value with its own memory, they become different:
b = copy a
-->(matrix3 [0.5,1,1] [0,1,0] [0,0,1] [0,0,0])
a == b
-->false
Possible workarounds:
a = matrix3 1
-->(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0])
b = matrix3 1
-->(matrix3 [1,0,0] [0,1,0] [0,0,1] [0,0,0])
a as string == b as string
-->true --converting to string is what I usually employ
a[1] == b[1] and a[2] == b[2] and a[3] == b[3] and a[4] == b[4]
-->true --comparing explicitly each component works too
(for i = 1 to 4 where a[i] != b[i] collect i).count == 0
-->true --this is a fancy way of comparing the components
Thanks for the explanation Bobo.
I hadnt been thinking of them like arrays, I had just assumed they were like values.
Also your “as string” solution is much better than the fix I had for it.
Thanks,