Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Matrix: Need help to understand this behavior (http://www.velocityreviews.com/forums/t852284-matrix-need-help-to-understand-this-behavior.html)

Marcio Braga 08-17-2008 01:55 PM

Matrix: Need help to understand this behavior
 
a=[1]
b=a # make matrix "b" equal matrix "a", but expected 2
separated matrices
b[0]=2*b[0] # I want to change matrix "b" (and not matrix "a")
p a # print matrix "a" and see the "issue"

The expected value in the matrix "a" should be 1, but instead it is 2.

Why ?

Thank you.
Marcio
--
Posted via http://www.ruby-forum.com/.


Frantisek ZACEK 08-17-2008 02:20 PM

Re: Matrix: Need help to understand this behavior
 
On Sun, Aug 17, 2008 at 3:55 PM, Marcio Braga <mbraga0001@gmail.com> wrote:
> a=[1]
> b=a # make matrix "b" equal matrix "a", but expected 2
> separated matrices
> b[0]=2*b[0] # I want to change matrix "b" (and not matrix "a")
> p a # print matrix "a" and see the "issue"
>
> The expected value in the matrix "a" should be 1, but instead it is 2.
>
> Why ?
>
> Thank you.
> Marcio



Typical Ruby behavior.

In Ruby, variables reference objects rather than contain values.
Therefore, when you write b = a, b references the same object as a does.
Therefore, when you modify b, you modify a.
See the obejct_ids in your code:

$>cat mat.rb
#!/usr/bin/env ruby -wKU

a = [1]
b = a
puts a.object_id
puts b.object_id
b[0] = 2 * b[0]
p a
p b
$>ruby mat.rb
284610
284610
[2]
[2]
$>

See ? same objects.

To do what you want, you need to duplicate your array rather than just
assign it :
$>cat dup_mat.rb
#!/usr/bin/env ruby -wKU

a = [1]
b = a.dup
puts a.object_id
puts b.object_id
b[0] = 2 * b[0]
p a
p b
$>ruby dup_mat.rb
284540
284530
[1]
[2]
$>

Hope it helped.

--
Frantisek ZACEK (zacek_f) -- SRS 2008


Marcio Braga 08-17-2008 02:22 PM

Re: Matrix: Need help to understand this behavior
 
Just to complement, as a contrast, the code below works as expected, or
in other words, the content of matrix "a" is not changed when you change
the content of matrix "b".

b=[]
a=[1]
b[0]=a[0] # explicitly set a single element and not the entire
matrix
b[0]=2*b[0]
p a

Marcio


Marcio Braga wrote:
> a=[1]
> b=a # make matrix "b" equal matrix "a", but expected 2
> separated matrices
> b[0]=2*b[0] # I want to change matrix "b" (and not matrix "a")
> p a # print matrix "a" and see the "issue"
>
> The expected value in the matrix "a" should be 1, but instead it is 2.
>
> Why ?
>
> Thank you.
> Marcio


--
Posted via http://www.ruby-forum.com/.


Marcio Braga 08-17-2008 02:26 PM

Re: Matrix: Need help to understand this behavior
 
Thank you Zacek. I understand your point and that help very much.

Have a nice day !!
Marcio


Frantisek ZACEK wrote:
> On Sun, Aug 17, 2008 at 3:55 PM, Marcio Braga <mbraga0001@gmail.com>
> wrote:
>> Thank you.
>> Marcio

>
>
> Typical Ruby behavior.
>
> .....
>
> Hope it helped.

--
Posted via http://www.ruby-forum.com/.


Frantisek ZACEK 08-17-2008 02:26 PM

Re: Matrix: Need help to understand this behavior
 
On Sun, Aug 17, 2008 at 4:22 PM, Marcio Braga <mbraga0001@gmail.com> wrote:
> Just to complement, as a contrast, the code below works as expected, or
> in other words, the content of matrix "a" is not changed when you change
> the content of matrix "b".
>
> b=[]
> a=[1]
> b[0]=a[0] # explicitly set a single element and not the entire
> matrix
> b[0]=2*b[0]
> p a
>
> Marcio
>
>


Here you create explicitely two objects therefore : no problem whereas
on the first snippet, you only have one.


--
Frantisek ZACEK (zacek_f) -- SRS 2008


Marcio Braga 08-17-2008 02:53 PM

Re: Matrix: Need help to understand this behavior
 
Zacek and all: how to duplicate a matrix that has elements that are also
matrix ?
For example:

a = [[1]]
b = a.dup
puts a.object_id
puts b.object_id
puts a[0].object_id # the same object
puts b[0].object_id # the same object
b[0][0] = 2 * b[0][0]
p a
p b

So, matrix "a" and "b" are different objects but each internal matrix
element continue to be the same object. Do I need to duplicate each one
?

Thank you
Marcio
--
Posted via http://www.ruby-forum.com/.


Frantisek ZACEK 08-17-2008 09:53 PM

Re: Matrix: Need help to understand this behavior
 
On Sun, Aug 17, 2008 at 4:53 PM, Marcio Braga <mbraga0001@gmail.com> wrote:
> Zacek and all: how to duplicate a matrix that has elements that are also
> matrix ?
> For example:
>
> a = [[1]]
> b = a.dup
> puts a.object_id
> puts b.object_id
> puts a[0].object_id # the same object
> puts b[0].object_id # the same object
> b[0][0] = 2 * b[0][0]
> p a
> p b
>
> So, matrix "a" and "b" are different objects but each internal matrix
> element continue to be the same object. Do I need to duplicate each one
> ?
>
> Thank you
> Marcio
> --
> Posted via http://www.ruby-forum.com/.
>
>



I don't think there is a simple way to achieve that.
I would suggest:
a=[[1]]
b=a.dup.colllect { |e| e.dup }

--
Frantisek ZACEK (zacek_f) -- SRS 2008


Todd Benson 08-17-2008 11:23 PM

Re: Matrix: Need help to understand this behavior
 
On Sun, Aug 17, 2008 at 9:53 AM, Marcio Braga <mbraga0001@gmail.com> wrote:
> Zacek and all: how to duplicate a matrix that has elements that are also
> matrix ?
> For example:
>
> a = [[1]]
> b = a.dup
> puts a.object_id
> puts b.object_id
> puts a[0].object_id # the same object
> puts b[0].object_id # the same object
> b[0][0] = 2 * b[0][0]
> p a
> p b
>
> So, matrix "a" and "b" are different objects but each internal matrix
> element continue to be the same object. Do I need to duplicate each one
> ?


It's a Matrix, right? (some of this stolen from a previous thread)...

require 'matrix'
class Matrix
def []=(i, j, n)
@rows[i][j] = n
end
end

m = Matrix[['a', 'b'], ['c', 'd']]
k = m.clone
k[0, 0] = 'e'
puts k.to_a
puts m.to_a

Todd


Marcio Braga 08-18-2008 10:33 PM

Re: Matrix: Need help to understand this behavior
 
> I don't think there is a simple way to achieve that.
> I would suggest:
> a=[[1]]
> b=a.dup.colllect { |e| e.dup }


Ok.
So I need to create "my own" function to do that (just in case
a=[[[1]]])

Thank you
--
Posted via http://www.ruby-forum.com/.


Marcio Braga 08-18-2008 10:38 PM

Re: Matrix: Need help to understand this behavior
 
> It's a Matrix, right? (some of this stolen from a previous thread)...
>
> require 'matrix'
> class Matrix
> def []=(i, j, n)
> @rows[i][j] = n
> end
> end
>
> m = Matrix[['a', 'b'], ['c', 'd']]
> k = m.clone
> k[0, 0] = 'e'
> puts k.to_a
> puts m.to_a
>
> Todd


At first I was not considering to handle them using Matrix class (just
Array class) but thank you to call attention to this clone method of
Matrix.

Marcio
--
Posted via http://www.ruby-forum.com/.



All times are GMT. The time now is 10:16 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.