Get part of matrix

Hi!
I’m looking for a way to get part of matix: eg:
my matrix:
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39]
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59]
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69]
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79]
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

How could i get part ( square ) of the matrix? If i choose the number
54, i would like to get the numbers [43,44,45,53,55,63,64,65], a 3x3
square.

I’m trying to understand the doc (
Class: Matrix (Ruby 1.9.3) ).

There’s a method to get this?

thanks,
Diego

Hi Diego,

I’m not sure you can do that with Ruby’s standard Matrix class, but you
surely can do it using SciRuby’s NMatrix:

require ‘nmatrix’
n = NMatrix.random(5) # Create a 5x5 matrix of random float values.
m = n[1 … 3, 1 … 3] # Select a square matrix centered
around
n[2,2].

And then you can print the matrices with:

n.pp
m.pp

You can read more about the project in the official website
http://sciruby.com/ or on the GitHub page
GitHub - SciRuby/nmatrix: Dense and sparse linear algebra library for Ruby via SciRuby
.

If you have any questions, please direct them at SciRuby’s mailing list:

https://groups.google.com/forum/#!forum/sciruby-dev

See you,


Carlos A.
Software Engineer @ Geekie (geekie.com.br)
+55 11 97320-3878
@carlos_agarie

2013/7/16 Diego N. [email protected]

On Tuesday 16 July 2013 Diego N. wrote

[80, 81, 82, 83, 84, 85, 86, 87, 88, 89]

thanks,
Dieog


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

I think the method you want is Matrix#minor. If I understand correctly,
you
want a 3x3 matrix “centered” on the element 54, corresponding to row 4
and
column 4. You can do:

matrix.minor(3…5,3…5)

or

matrix.minor(3,3,3,3)

In the first case, you pass the range of rows and columns to return as
two
Range objects; in the second case, you give the first row and the number
of
rows, the starting column and the number of columns.

I hope this helps

Stefano

You could always open the Matrix class and add your own method, with all
the handling to deal with corners, etc.

First, thanks Carlos A. and Stefano C. for help me! :slight_smile:

I decided to use the native Matrix class… but i needed to get square
around 54, for instance:

I’m trying to make a method:

def build_matrix(r=0, c=0)
m = Matrix.build(c, r) {|row, col| col + (row * r) }
end

def my_method(position, size)
rows_size = 10
cols_size = 10

matrix  = build_matrix(rows_size, cols_size)
area      = position - (Math.sqrt(size).to_i *

rows_size) - Math.sqrt(size).to_i
return matrix.minor(matrix.index(area)[0],
size,matrix.index(area)[1], size)
end

= my_method(54, 3)
-> Matrix[[43, 44, 45], [53, 54, 55], [63, 64, 65]]

= my_method(54, 3)
-> Matrix[[32, 33, 34, 35, 36], [42, 43, 44, 45, 46], [52, 53, 54, 55,
56], [62, 63, 64, 65, 66], [72, 73, 74, 75, 76]]

Where i pass 54(name of position) and 3(area of square).

It work! But, if i pass 40, for instance not work as well, because 40 is
on the corner…

Anyone knows if the matrix class can do this easier? get the square
around 54. 54 is my center…
On position 40, it should return ( 30, 31, 41, 50, 51)…

Thanks on more time!
Diego

Does your matrix always have these values in these locations?
If so, maybe you do not need a matrix.

def get_around(t)
k = [-11,-10,-9,-1,1,9,10,11]
k.map{|z| t+z}.select{|f| (t%10-f%10).abs<2 && f>=10 && f<=99}
end

p get_around(54) #> [43, 44, 45, 53, 55, 63, 64, 65]
p get_around(40) #> [30, 31, 41, 50, 51]

I have not verified the output for every case. You can do that if you
are
interested in this approach.

Harry

Thanks everyone for help!

Thanks Harry K., I will try to use your method… I don’t know if my
matrix always have these values yet…

best,
Diego